蒟蒻吃药计划-治疗系列 #round4 多重背包+混合背包代码存放

 1 #include <bits/stdc++.h>
 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
 4 using namespace std;
 5 int v[1000+20],w[1000+20],s[1000+20];
 6 int dp[1000+20];
 7 int n,m;
 8 inline int botposs(int a,int b,int pd){
 9     if(pd==1) return a>b?a:b;
10     if(pd==0) return a<b?a:b;
11 }
12 int main(){
13     scanf("%d%d",&n,&m);
14     fp(i,1,n){
15         scanf("%d%d%d",&v[i],&w[i],&s[i]);
16     }
17     fp(i,1,n){
18         fd(j,m,0){
19             fp(k,0,s[i]){
20                 if(j-k*v[i]<0){
21                     break;
22                 }
23                 dp[j]=botposs(dp[j],dp[j-k*v[i]]+k*w[i],1);
24             }
25         }
26     }
27     printf("%d",dp[m]);
28     return 0;
29 }
多重背包(空间优化O(v))
 1 #include <bits/stdc++.h>
 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
 4 using namespace std;
 5 int v[1000+20],w[1000+20];
 6 int dp[1000+20];
 7 int n,m,n1;
 8 inline int botposs(int a,int b,int pd){
 9     if(pd==1) return a>b?a:b;
10     if(pd==0) return a<b?a:b;
11 }
12 int main(){
13     scanf("%d%d",&n,&m);
14     int x,y,s,t=1;
15     fp(i,1,n){ 
16         scanf("%d%d%d",&x,&y,&s);
17         while(s>=t){
18             v[++n1]=x*t;
19             w[n1]=y*t;
20             s-=t;
21             t*=2;
22         }
23         v[++n1]=x*s;
24         w[n1]=y*s;
25     }
26     fp(i,1,n1){
27         fd(j,m,v[i]){
28             dp[j]=botposs(dp[j],dp[j-v[i]]+w[i],1);
29         }
30     }
31     printf("%d",dp[m]);
32     return 0;
33 }
多重背包(终极优化)

(其实不是很终极辣)

 1 #include <bits/stdc++.h>
 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
 4 using namespace std;
 5 int c[1000+20],w[1000+20],p[1000+20];
 6 int dp[1000+20];
 7 int n,m,n1;
 8 inline int botposs(int a,int b,int pd){
 9     if(pd==1) return a>b?a:b;
10     if(pd==0) return a<b?a:b;
11 }
12 int main(){
13     scanf("%d%d",&m,&n);
14     fp(i,1,n){
15         scanf("%d%d%d",&w[i],&c[i],&p[i]);
16     }
17     fp(i,1,n){
18         if(p[i]==0){
19             fp(j,w[i],m){
20                 dp[j]=botposs(dp[j],dp[j-w[i]]+c[i],1);
21             }
22         }
23         else{
24             fp(j,1,p[i]){
25                 fd(k,m,w[i]){
26                     dp[k]=botposs(dp[k],dp[k-w[i]]+c[i],1);
27                 }
28             }
29         }
30     }
31     printf("%d",dp[m]);
32     return 0;
33 }
混合背包(没啥好优化的)
原文地址:https://www.cnblogs.com/Fraction/p/BagTellingTwo.html