貪心水題,性價比最高的方式是先選擇單位價值最大的糖果,如果超量,就放一部分,不超量就繼續放次單位價值大的糖果。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct mem {
int v,w;
double density;
};
mem box[110];
int n,w;
double totv,totw;
bool cmp(const mem &a,const mem &b) //根據糖果的單位價值進行從大到小排序
{
return a.density>b.density;
}
int main()
{
cin>>n>>w;
for(int i=0;i<n;i++) {
cin>>box[i].v>>box[i].w;
box[i].density=1.0*box[i].v/box[i].w;
}
sort(box,box+n,cmp);
totv=totw=0;
for(int i=0;i<n;i++) { //從單位價值大到小的順序放糖果
if(totw+box[i].w<=w){ //判斷糖果重量是否超標
totw+=box[i].w;
totv+=box[i].v;
}else{
totv+=box[i].density*(w-totw);
totw=w;
break;
}
}
printf("%.1f\n",totv); //注意輸出要求,保留一位小數
return 0;
}