该问题是输入物品个数和背包的大小,然后输入每个物品的重量和总价,求背包最大价值,且物品可以被分成一部分放入背包。
#include<iostream>
#include<algorithm>
using namespace std;
struct goods{
double w; //物品重量
double v; //物品总价
double p; //物品单价
}s[10000];
bool cmp(goods a,goods b){
return a.p >b.p; //降序排列
}
int main(){
int n; //物品数量
double total; //背包总容量
cin>>n>>total;
for(int i=0;i<n;i++){
cin>>s[i].w>>s[i].v;
s[i].p=s[i].v/s[i].w
;
}
sort(s,s+n,cmp); //降序排列,找到单价最大的物品
double value = 0.0; //背包物品价值
double tmp = 0.0; //背包目前容量
for(int i=0;i<n;i++){
tmp+=s[i].w;
if(tmp<total){
value+=s[i].v;
}
else
{
value=value+s[i].v-(tmp-total)*s[i].p; //超出的话是该物品的价值-该物品超出的质量的价值
break;
}
}
cout<<value<<endl; //输出最大价值
return 0;
}
其中还有一种处理方式
for(int i=0;i<n;i++){
if(total>s[i].w)
{
total-=s[i].w;
value+=s[i].v;
}
else
{
value+=total*s[i].p;
break;
}
}
大家觉得哪个好理解可以用哪个
样例