【模板】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 }
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]}
未完待续

浙公网安备 33010602011771号