非常详细
2024-07-25 20:50:28
发布于:山东
10阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
struct node{
int weight;//重量
int value;//价值
double every;//单位重量价值
};//结构体
bool cmp(node x,node y){//应该指的是前后两次结构体中every的值
return x.every>y.every;//自定义排序,谁的性价比高谁往前排
}
int main(){
int k;//输入多少组数据
cin>>k;
while(k--){//一组一组的输入
int w;//口袋承重上限
int s;//金属种类
double last=0;//代表最后带回去的总价值
node a[105];//保存金属重量与金属价值
cin>>w>>s;//!一定要输入
for(int i=1;i<=s;i++){
cin>>a[i].weight>>a[i].value;//一次输入重量与价值
a[i].every=a[i].value*1.0/a[i].weight;//算出单位重量的价值,并保存再上面结构体中every变量(乘以1.0是让他有两位小时)
}
sort(a+1,a+s+1,cmp);//按性价比排好,方便贪心
for(int i=1;i<=s;i++){
if(w-a[i].weight<0){//当剩下的可成重量小于一整块金属的重量是就要进行分割
last+=a[i].every*w;//用剩下的重量乘以这种金属的单位重量价值,求出最后的值
break;//最后一次计算,计算完后结束运行
}
//接下来是否则
w-=a[i].weight;//用口袋重量上限减去这块金属所需重量
last+=a[i].value;//加上这块金属的价值
}
printf("%.2f\n",last);//按要求两位小数输出
}//!注意while循环大括号的位置
return 0;
}
这里空空如也
有帮助,赞一个