多重背包问题

51Nod1086

分析:二进制优化多重背包,推荐一篇不错的blog,点我

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=5e5+10;
 7 int n,m;
 8 int w[maxn],p[maxn],c[maxn];
 9 long long dp[maxn];
10 int main()
11 {
12     cin>>n>>m;
13     for(int i=1;i<=n;i++)
14         scanf("%d%d%d",&w[i],&p[i],&c[i]);
15     int cnt=n;
16     for(int i=1;i<=n;i++){
17         for(int j=1;;j*=2){
18             if(c[i]>=j){
19                 ++cnt;
20                 w[cnt]=j*w[i],p[cnt]=j*p[i],c[i]-=j;
21             }else{
22                 w[i]=c[i]*w[i],p[i]=p[i]*c[i];break;
23             }
24         }
25     }
26     for(int i=1;i<=cnt;i++){
27         for(int j=m;j>=w[i];j--){
28             dp[j]=max(dp[j],dp[j-w[i]]+p[i]);
29         }
30     }
31     cout<<dp[m]<<endl;
32 }
View Code

 

转载于:https://www.cnblogs.com/wolf940509/p/7569176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值