多重揹包問題

51Nod1086html

分析:二進制優化多重揹包,推薦一篇不錯的blog,點我ios

 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
相關文章
相關標籤/搜索