思路点拨:
先通过排序,保证先拿价值最大的;
再通过判断,如果包还有空间,就全拿
空间不够,就尽可能多拿
参考代码:
#include<iostream>
#include<algorithm> //使用sort需用此头文件
using namespace std;
//定义结构体node,包含w重量,v总价值
struct node{
float w,v;
}a[110];
//自定义比较(从大到小)
bool cmp(node a,node b)
{
return a.v*b.w>a.w*b.v;//交叉相乘
}
int main()
{
int n,t;//n代表有n堆金币,t代表承重为t的包
float ans=0.0;//答案
cin>>n>>t;
for(int i=1;i<=n;i++)
cin>>a[i].w>>a[i].v;//输入
sort(a+1,a+n+1,cmp);//排序
for(int i=1;i<=n;i++)//一次遍历
{
//如果t大于等于重量说明背包还有总够的
//空间,可以全部拿走,只需把答案加上这
//堆的总价值即可
if(t>=a[i].w)
{
ans=ans+a[i].v;
t=t-a[i].w;
}
//反之,就是不能全部装下,装得越多越好
else{
ans=ans+t*(a[i].v/a[i].w);//先算出每千克价值多少
break; //再乘上t还可以装多少
//千克即可
}
}
printf("%.2f",ans);//输出
return 0;
}
我还是一名小学生,这是我第一次提交,希望大家支持😁