[USACO1.3]混合牛奶 Mixing Milk(贪心背包问题)

在这里插入图片描述在这里插入图片描述
题解:此题为贪心背包问题,先将奶农按价格排序,然后从单价最小的取起,直到将背包装满为止,也就是到满足数量为止

#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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值