【模板】DP专题

 

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,m,a[101],dp[10001];
 5 int main(){
 6     scanf("%d%d",&n,&m);
 7     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 8     dp[0]=1;
 9     for(int i=1;i<=n;i++)
10       for(int j=m;j>=a[i];j--)
11         dp[j]+=dp[j-a[i]];
12     printf("%d",dp[m]);
13 }
01背包
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n,m,w[101],v[101],c[101],dp[1001];
 5 int main(){
 6     scanf("%d%d",&n,&m);
 7     for(int i=1;i<=n;i++) scanf("%d%d%d",&w[i],&v[i],&c[i]);
 8     //w[i] weight,v[i] value,c[i] count
 9     for(int i=1;i<=n;i++)
10       for(int j=m;j>=0;j--)
11         for(int k=0;k<=c[i];k++){
12             if(j-k*w[i]<0) break;
13             dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
14         }
15     printf("%d",dp[m]);
16 }
完全背包
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int N,n,m,w[101],v[101],dp[1001];
 5 int main(){
 6     scanf("%d%d",&N,&m);
 7     for(int i=1;i<=N;i++) {
 8       int x,y,z,t=1;
 9       scanf("%d%d%d",&x,&y,&z);
10       while(z>=t){
11           w[++n]=x*t;
12           v[n]=y*t;
13           z-=t;
14           t*=2;
15       }
16       w[++n]=x*z;
17       v[n]=y*z;
18     }
19     for(int i=1;i<=n;i++)
20       for(int j=m;j>=w[i];j--)
21         dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
22     printf("%d",dp[m]);
23 } 
二进制优化
for 所有的组k 
    for v=V..0 
        for 所有的i属于组k 
            f[v]=max{f[v],f[v-c[i]]+w[i]}

        
分组背包

 

未完待续

posted @ 2020-10-22 17:54  latent_Lin  阅读(102)  评论(0)    收藏  举报