HDU3236 Gift Hunting

 1 /*
 2  HDU3236 Gift Hunting
 3  http://acm.hdu.edu.cn/showproblem.php?pid=3236
 4  dp 滚动数组
 5  *
 6  *
 7  */
 8 #include <cstdio>
 9 #include <algorithm>
10 using namespace std;
11 const int Nmax=305;
12 const int INF=1e9;
13 int dp[2][505][55][2];
14 int v1,v2,n,ans;
15 
16 struct A
17 {
18     int w;
19     int v;
20     int is;
21 }a[Nmax];
22 
23 
24 void init()
25 {
26     ans=-INF;
27 }
28 
29 
30 int work()
31 {
32     int t=0;
33     for(int j=0;j<=v1;j++)
34         for(int k=0;k<=v2;k++)
35             dp[t][j][k][0]=dp[t][j][k][1]=dp[t^1][j][k][0]=dp[t^1][j][k][1]=-INF;
36     dp[t^1][0][0][0]=0;
37     for(int i=1;i<=n;i++)
38     {
39         for(int j=0;j<=v1;j++)
40         {
41             for(int k=0;k<=v2;k++)
42             {
43                 int v=a[i].v,w=a[i].w;
44                 if(j-v>=0)
45                 {
46                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j-v][k][0]+w);
47                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j-v][k][1]+w);
48                 }
49                 if(k-v>=0)
50                 {
51                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k-v][0]+w);
52                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k-v][1]+w);
53                 }
54                 if(!a[i].is)
55                 {
56                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][1]);
57                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k][0]);
58                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][1]);
59                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k][0]);
60                 }
61                 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][0]+w);
62             }
63         }
64         t^=1;
65         for(int j=0;j<=v1;j++)
66             for(int k=0;k<=v2;k++)
67                 dp[t][j][k][0]=dp[t][j][k][1]=-INF;
68     }
69     t^=1;
70     for(int j=0;j<=v1;j++)
71         for(int k=0;k<=v2;k++)
72         {
73             ans=max(ans,dp[t][j][k][0]);
74             ans=max(ans,dp[t][j][k][1]);
75         }
76     return max(-1,ans);
77 }
78 
79 
80 int main()
81 {
82     //freopen("4.in","r",stdin);
83     int cases=0;
84     while(1)
85     {
86         cases++;
87         scanf("%d%d%d",&v1,&v2,&n);
88         if(!n && !v1 && !v2)
89             break;
90         for(int i=1;i<=n;i++)
91             scanf("%d%d%d",&a[i].v,&a[i].w,&a[i].is);
92         init();
93         printf("Case %d: %d\n\n",cases,work());
94     }
95     return 0;
96 }

 

posted @ 2017-03-24 11:39  BBBob  阅读(161)  评论(0编辑  收藏  举报