多重背包问题

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

 

posted @ 2017-09-21 16:18  wolf940509  阅读(100)  评论(0编辑  收藏  举报