Ahui Writes Word
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2076 Accepted Submission(s): 757
Question: the maximum value Ahui can get.
Note: input words will not be the same.
Each of the next N line are a string and two integer, representing the word, the value(Vi ) and the complexity(Ci ). (0 ≤ Vi , Ci ≤ 10)
5 20 go 5 8 think 3 7 big 7 4 read 2 6 write 3 5
15代码:这道题不能用01背包问题解决,会超时,将其化为多重背包问题#include<stdio.h> #include<string.h> int max(int x,int y) { if(x > y) return x; else return y ; } char a[100001] ; int w[12][12] ; int f[100001] ; int va[100001] ; int v[100001] ; int N = 0 ,C = 0;
//完全背包 void completepack(int x ,int y) { for(int i = y ; i <= C ; i++ ) f[i] = max(f[i],f[i-y] + x) ; }
//01背包 void zeroonepack(int x,int y) { for(int i = C ; i >= y ; i-- ) f[i] = max(f[i],f[i-y] + x) ; }
//多重背包,这里需要用到二进制优化 void multipack(int x,int y,int n) { if(n * y >= C) completepack(x,y) ; else { int k = 1 ; while(k < n) { zeroonepack(k * x , k * y) ; n -= k ; k *= 2 ; } zeroonepack(n * x , n * y) ; } } int main() { while(~scanf("%d%d",&N,&C)) { int i = 0 , j = 0 ; int x = 0 , y = 0 ; memset(a,0,sizeof(a)); memset(w,0,sizeof(w)); memset(f,0,sizeof(f)); memset(va,0,sizeof(va)); memset(v,0,sizeof(v)); for(i = 1 ;i <= N ; i++) { scanf("%s%d%d",a,&x,&y); w[x][y]++; } for(i = 0 ;i < 11 ; i++) { for(j = 0 ; j < 11 ; j++) { multipack(i,j,w[i][j]); } }
printf("%d\n",f[C]); } return 0 ; }