问题描述:
圣诞节来临了,圣诞老人准备分发糖果,现在有很多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走,圣诞老人只能装重量w的糖果,请问圣诞老人最多能带走多大价值的糖果。
思路分析:
贪心算法:对糖果单价排序,选单价最大的优先带走
代码实现:

#include<cstdio>
#include<algorithm>
using namespace std;
struct ss {
	int a,b;
	double c;
	bool operator < (const ss & d)const {//操作符重载 
		return c>d.c;
	}
};
int main() { 
	int n,m;
	scanf("%d%d",&n,&m);
	struct ss d[n];
	for(int i=0; i<n; ++i) {
		scanf("%d%d",&d[i].a,&d[i].b);
		d[i].c=1.*d[i].a/d[i].b;//算礼物单价 
	}
	sort(d,d+n);
	double sum=0;
	for(int i=0; i<n; ++i) {
		if(d[i].b>=m) {//如果当前礼物单价最大且量够,就全取完 
			sum+=m*d[i].c;
			m=0;
		} else {//否则单价最大的拿完,相应的承载重量减去拿的量,接着遍历下一个单价最大的 
			sum+=d[i].c*d[i].b;
			m-=d[i].b;
		}
		if(m==0) {
			printf("%.1lf\n",sum);
			break;
		}
	}
	return 0;
}