题意:
某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1, n2, ... , ns,同时每个种类的金属总的价值也不同,分别为v1,v2, ..., vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。
输入数据
输出要求
样例输入
2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43
样例输出
171.93
508.00
题目理解:
需要定义一个金属块的结构体,结构体内存放金属块的重量,价值和单位重量的价值。输入数据后,调用sort排序对金属块按照其单位重量的价值进行从大到小排序,后按照排序后的金属块,利用for循环对背包当前所剩容量进行判断,若所剩容量大于等于当前金属快的质量,则将金属块全部放入背包;若小于,则将金属块切割后放入背包。当背包容量<=0的时候,则退出循环,则当前的背包所载金属块的价值最大。
注意:
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<deque>
#include<fstream>
#include<iomanip>
#include<map>
#include<queue>
#include<string>
#include<set>
#include<stack>
#include<vector>
typedef long long ll;
using namespace std;
struct js{ //定义金属块
double w;
double v;
double avg;
}jsk[107];
bool cmp(struct js a,struct js b)
{
return (a.avg>b.avg);
}
int main()
{
int k;
cin>>k;
for(int s=0;s<k;s++)
{
int N;
int S;
cin>>S>>N;
for(int i=0;i<N;i++)
{
cin>>jsk[i].w;
cin>>jsk[i].v;
jsk[i].avg=(1.0)*jsk[i].v/jsk[i].w;//求金属块每单位质量的价值
}
/* for(int i=1;i<=N;i++)
{
cout<<jsk[i].w<<jsk[i].v<<endl;
}*/
sort(jsk,jsk+N,cmp);//按照均重从大到小排序
/*for(int i=0;i<N;i++)
{
cout<<jsk[i].avg<<endl;
}*/
double mm=0;
for(int i=0;i<N;i++)
{
if(S<=0) break;//背包容量小于等于0,则表示背包全部装满,退出循环。
if(jsk[i].w>S) {//如果当前金属块质量大于背包所剩载重,则将金属块进行切割。
mm+=S*jsk[i].avg;
S=0;
}
else {//如果当前金属块质量小于或等于所剩载重,则将金属块全部放入背包。
mm+=jsk[i].v;
S-=jsk[i].w;
}
}
printf("%.2f\n",mm);
}
return 0;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有