问题描述:
圣诞节来临了,圣诞老人准备分发糖果,现在有很多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走,圣诞老人只能装重量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;
}