分组背包+至少一个+最多一个+随意。
包之间的传值就是把上一组的背包复制到这组背包中,达到背包之间的联系。
http://acm.hdu.edu.cn/showproblem.php?pid=3535
Time
Limit: 2000/1000 MS (Java/Others) Memory Limit:
32768/32768 K (Java/Others)
Total Submission(s):
2676 Accepted Submission(s):
995
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 |
#include<iostream> #include<cstring> #include<cstdio> #define Min -99999 using
namespace std; int max( int
x, int y) { if (x>y) return
x; else return
y; } int
dp[200][200]; int
w[200],v[200]; int
main() { int
n,t,i,j,m,s,k; while (~ scanf ( "%d%d" ,&n,&t)) { memset (dp,0, sizeof (dp)); for (i=1;i<=n;i++) { cin>>m>>s; for (j=1;j<=m;j++) cin>>w[j]>>v[j]; if (s==0) { for (j=0;j<=t;j++) dp[i][j]=Min; for (j=1;j<=m;j++) { for (k=t;k>=w[j];k--) { dp[i][k]=max( dp[i][k],dp[i][k-w[j]]+v[j]); dp[i][k]=max( dp[i][k],dp[i-1][k-w[j]]+v[j]); } } } else
if (s==1) { for (j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; for (j=1;j<=m;j++) { for (k=t;k>=w[j];k--) { dp[i][k]=max( dp[i][k],dp[i-1][k-w[j]]+v[j]); } } } else { for (j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; for (j=1;j<=m;j++) { for (k=t;k>=w[j];k--) { dp[i][k]=max( dp[i][k],dp[i][k-w[j]]+v[j]); dp[i][k]=max( dp[i][k],dp[i-1][k-w[j]]+v[j]); } } } } if (dp[n][t]<=0) cout<< "-1" <<endl; else cout<<dp[n][t]<<endl; } return
0; } |
HDU-3535 AreYouBusy,布布扣,bubuko.com
原文:http://www.cnblogs.com/cancangood/p/3619016.html