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 }