リュック9説の7(依存するリュックの問題がある)
6401 ワード
1 /*
2 , i j, i, j
3 http://acm.hdu.edu.cn/showproblem.php?pid=3449
4 , ,
5 ,
6 n , cnt[i]
7 ,
8 , 2^n+1 , 。 。
9 , 2^n+1 。
10 , 。 01 , v-c[i]...0
11 dp2[v-c[i]...0]
12
13 */
14 #include <stdio.h>
15 #include <string.h>
16 int dp[100000+10],dp2[100000+10];
17 int box[55],cnt[55],price[55][11],value[55][11];
18 inline int max(const int &a, const int &b)
19 {
20 return a < b ? b : a;
21 }
22 int main()
23 {
24 int n,v,i,j,k;
25 while(scanf("%d%d",&n,&v)!=EOF)
26 {
27 memset(dp,0,sizeof(dp));
28 for(i=1; i<=n; ++i)
29 {
30 scanf("%d%d",&box[i],&cnt[i]);
31 memcpy(dp2,dp,sizeof(dp));
32 for(j=1; j<=cnt[i]; ++j)
33 {
34 scanf("%d%d",&price[i][j],&value[i][j]);
35 for(k=v-box[i]; k>=price[i][j]; --k)// 01 , dp2[k]
36 dp2[k] = max(dp2[k],dp2[k-price[i][j]]+value[i][j]);
37 }
38 for(k=box[i];k<=v; ++k)
39 dp[k] = max(dp[k],dp2[k-box[i]]);// k , i
40 }
41 printf("%d
",dp[v]);
42 }
43 return 0;
44 }