hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (dp 多重背包)
转化为01背包
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct Rice { int v,w,c; }; Rice r[120]; int dp[50000]; int main() { int t,n,m; int p,h,c; int i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) { scanf("%d%d%d",&p,&h,&c); r[i].w=p; r[i].v=h; r[i].c=c; } memset(dp,-1,sizeof(dp)); dp[0]=0; int ans=0; for(i=0;i<n;i++) { for(j=0;j<r[i].c;j++) { for(k=m;k>=r[i].w;k--) { if(dp[k-r[i].w]>=0) { dp[k]=max(dp[k],dp[k-r[i].w]+r[i].v); ans=max(dp[k],ans); } } } } printf("%d\n",ans); } return 0; }
二进制优化
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct Rice { int v,w,c; }; Rice r[120]; int dp[50000]; int main() { int t,n,m; int p,h,c; int i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) { scanf("%d%d%d",&p,&h,&c); r[i].w=p; r[i].v=h; r[i].c=c; } memset(dp,-1,sizeof(dp)); dp[0]=0; int ans=0; for(i=0;i<n;i++) { int tot=r[i].c; for(j=1;j<=tot;j*=2) { tot-=j; for(k=m;k>=j*r[i].w;k--) { if(dp[k-j*r[i].w]>=0) { /* if(k==m) { printf("%d %d..\n", j,r[i].w); } */ dp[k]=max(dp[k],dp[k-j*r[i].w]+r[i].v*j); ans=max(ans,dp[k]); } /*for(int l=0;l<=m;l++) { printf("%d ",dp[l]); } printf("\n"); */ } } //printf("%d..\n",r[i].w); if(tot!=0) { for(k=m;k>=tot*r[i].w;k--) { //printf("%d....\n",k); if(dp[k-tot*r[i].w]>=0) { dp[k]=max(dp[k],dp[k-tot*r[i].w]+r[i].v*tot); ans=max(ans,dp[k]); } } } } printf("%d\n",ans); } return 0; }