题解:此题为贪心背包问题,先将奶农按价格排序,然后从单价最小的取起,直到将背包装满为止,也就是到满足数量为止
#include<iostream>
#include<algorithm>
using namespace std;
struct milker{
int money;//单价
int amount;//产量
};
int n,m;
void paixu(milker mk[]){
int t;
for(int i=0;i<m-1;i++){
for(int j=0;j<m-1-i;j++){
if(mk[j].money>mk[j+1].money){
t=mk[j].money;
mk[j].money=mk[j+1].money;
mk[j+1].money=t;
t=mk[j].amount;
mk[j].amount=mk[j+1].amount;
mk[j+1].amount=t;
}
}
}
}
int main(){
cin>>n>>m;
milker mk[5005];
//读入奶农基本信息
for(int i=0;i<m;i++){
cin>>mk[i].money>>mk[i].amount;
}
//以单价为基准排序
paixu(mk);
/*for(int i=0;i<m;i++){
cout<<mk[i].money<<" "<<mk[i].amount<<endl;
}*/
//开始选奶农
int almoney=0,count=0;
for(int i=0;i<m;i++){
if(count>=n){//数量够了
break;
}
if(count+mk[i].amount>n){//当最后一个奶农总产量大于所需量
almoney+=(n-count)*mk[i].money;
break;
}
almoney+=mk[i].money*mk[i].amount;//计算价钱
count+=mk[i].amount;//增加背包重量
}
cout<<almoney<<endl;
return 0;
}