题目描述:
输入输出:
解释:
可以用贪心解决。
第一步,排序:已知金币可分割且重量价值比不变,那么可以求出每个金币的重量价值比并据此从大到小排序(可以用结构体);
第二步,按照重量价值比从大到小,先依次装入完整的金币,直到某金币的时候,剩下的背包容量不够将其完整装入,那么最后一次可以装入的就是剩余背包容量*该金币的重量价值比。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,t;//n堆金币,总容量t
const int N=110;
struct Gold{
int w,v;
double vw;
}gold[N];
bool cmp(Gold x,Gold y)
{
return x.vw>y.vw;
}
int main()
{
int i;
double sum=0;
scanf("%d%d",&n,&t);
for(i=1;i<=n;i++)
{
int w,v;
scanf("%d%d",&w,&v);
gold[i].w=w,gold[i].v=v,gold[i].vw=v*1.0/w;
}
sort(gold+1,gold+n+1,cmp);
int flag=1;
while(t>=gold[flag].w)
{
sum+=gold[flag].v;
t-=gold[flag].w;
flag++;
}
sum+=t*gold[flag].vw;
printf("%.2lf\n",sum);
return 0;
}
写在最后:文章多有不足,代码不一定简洁,欢迎各位大佬指正!