HDU 3732 Ahui Writes Word
这题乍一看是01背包水题,其实一看数据,明显直接01背包是过不了的, 再看那个V-C的范围是0-10 很明显,可能的搭配数最多也就121种
那么我就开一个数组记录下各种搭配的数量,用多重背包过
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int dp[10005]; char s[15]; int v, c, data[11][11], m; void deal(int vi,int w,int num) { int i, j, k; k=1; while(k<num) { for(j=m;j>=k*w;j--) dp[j]=max(dp[j],dp[j-k*w]+k*vi); num-=k; k*=2; } for(i=m;i>=num*w;i--) dp[i]=max(dp[i],dp[i-num*w]+num*vi); } int main() { int n, i, j; while(scanf("%d%d",&n,&m)!=EOF) { memset(dp,0,sizeof(dp[0])*(m+1)); memset(data,0,sizeof(data)); for(i=0; i<n; i++) { scanf("%s%d%d",s,&v,&c); data[v][c]++; } for(i=1;i<=10;i++) { for(j=0;j<=10;j++) { if(data[i][j]>0) deal(i,j,data[i][j]); } } printf("%d\n",dp[m]); } return 0; }