标签:hdu div tput 进制 test turn imp 重复 exce
InputThe 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)
OutputOutput the maximum value in a single line for each test case.
Sample Input
5 20 go 5 8 think 3 7 big 7 4 read 2 6 write 3 5
Sample Output
15
Hint
Input data is huge,please use “scanf(“%s”,s)”
题意:给你n个物品的价值和费用,在给定的总费用内输出最大价值。
思路:数据过大,01背包tle,由于题目给出了(0 ≤ Vi , Ci ≤ 10)这一条件,说明有大量价值和费用重复,我们可以考虑多重背包,也可以用二进制数优化后转为01背包,数量的存储可以用一个二维数组进行存储。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f #define N 10010 int dp[N],w2[N],v2[N],value[N*10],weight[N*10],num[20][20]; char ch[20]; int n,v; int main() { int i,k,j,ans,x,y; while(scanf("%d%d",&n,&v)!=EOF) { memset(num,0,sizeof(num)); for(i = 1; i <= n; i ++) { scanf("%s%d%d",ch,&value[i],&weight[i]); num[value[i]][weight[i]]++; } memset(dp,0,sizeof(dp)); ans = 0; for(i = 1; i <= n; i ++) { x = value[i],y = weight[i]; for(j = 1; num[x][y]>0; j*=2) { k = min(j,num[x][y]); w2[++ans] = k*y; v2[ans] = k*x; num[x][y]-= k; } } for(i = 1; i <= ans; i ++) { for(j = v; j >= w2[i]; j --) dp[j] = max(dp[j],dp[j-w2[i]]+v2[i]); } printf("%d\n",dp[v]); } return 0; }
【背包专题】F - Ahui Writes Word hdu3732【01背包+二进制优化】
标签:hdu div tput 进制 test turn imp 重复 exce
原文地址:http://www.cnblogs.com/chengdongni/p/7434922.html