杭电3732 Ahui Writes Word (多重背包问题)
2014-07-14 17:17
344 查看
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
[align=left]Problem Description[/align]
We all know that English is very important, so Ahui strive for this in order to learn more English words. To know that word has its value and complexity of writing (the length of each word does not exceed 10 by only lowercase letters),
Ahui wrote the complexity of the total is less than or equal to C.
Question: the maximum value Ahui can get.
Note: input words will not be the same.
[align=left]Input[/align]
The first line of each test case are two integer N , C, representing the number of Ahui’s words and the total complexity of written words. (1 ≤ N ≤ 100000, 1 ≤ C ≤ 10000)
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)
[align=left]Output[/align]
Output the maximum value in a single line for each test case.
[align=left]Sample Input[/align]
5 20 go 5 8 think 3 7 big 7 4 read 2 6 write 3 5
[align=left]Sample Output[/align]
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 ; }
相关文章推荐
- 杭电2159背包问题!
- 杭电2602(01背包问题)——第一次做背包问题的理解
- 动态规划之完全背包问题杭电1114
- 杭电1203 DP 背包问题 (2010-12-23 20:42)
- 杭电OJ 1248 完全背包问题 及反思
- 杭电1712-分组背包问题
- 背包问题—杭电2602 Bone Collector
- 杭电 2111 Saving HDU 贪心算法 背包问题
- 杭电 1284 钱币兑换问题【完全背包求方案总数】
- 背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191
- (背包问题)杭电2602Bone Collector--动态规划入门
- 杭电2602(01背包问题)——第一次做背包问题的理解
- 杭电 2602 Bone Collector(背包问题 )
- 杭电1284 钱币兑换问题(完全背包)
- 杭电2159-二维费用的背包问题
- 杭电2546 灵活运用01背包问题
- 杭电 2159 FATE(二维费用背包问题)
- HDU 3732 Ahui Writes Word(多重背包问题)
- 杭电2191,有关背包问题1
- 杭电ACM 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包问题)