贪心算法-最大背包问题

该问题是输入物品个数和背包的大小,然后输入每个物品的重量和总价,求背包最大价值,且物品可以被分成一部分放入背包。

#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;

}

}

大家觉得哪个好理解可以用哪个

样例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值