Vijos 1313 金明的预算方案 (分组背包)

题目链接

和多校上的黄金矿工很类似,貌似这个还简单点,每个主件,最多有2个附件,讨论下就可以,当然也神似树形DP。自己做的时候SB了,边输入边处理了,想当然了,果断悲剧了,交了N次之后,发现把背包分组的会错误,最可恨的是不知道该怎么搞了,想快排的,结构体神马的,发现从0开始,后来写的会很麻烦。。受不了了,把以前的代码改改,先把根找到,然后枚举他的孩子。。。虽然效率低点,终于DEBUG好几个小时后,终于乱搞过了。。。代码能力弱爆了,不会乱搞啊。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 int v[50000],bag[201][10],que[201],c[201][10],q[201],p[201],o[201];
 5 int main()
 6 {
 7     int i,j,k,n,m,num;
 8     scanf("%d%d",&n,&m);
 9     n = n/10;
10     num = 1;
11     for(i = 1; i <= m; i ++)
12     {
13         scanf("%d%d%d",&bag[i][1],&p[i],&q[i]);
14         bag[i][1] /= 10;
15         if(q[i] == 0)
16         {
17             o[i] = 1;
18             que[num++] = i;
19             c[i][1] = bag[i][1]*p[i];
20         }
21     }
22     for(i = 1; i <= m; i ++)
23     {
24         if(o[i] == 1)
25         {
26             k = 1;
27             for(j = 1;j <= m;j ++)
28             {
29                 if(q[j] == i&&k == 1)
30                 {
31                     k ++;
32                     bag[i][2] = bag[i][1] + bag[j][1];
33                     c[i][2] = c[i][1] + bag[j][1]*p[j];
34                 }
35                 else if(q[j] == i&&k == 2)
36                 {
37                     bag[i][3] = bag[i][1] + bag[j][1];
38                     c[i][3] = bag[i][1] + bag[j][1]*p[j];
39                     bag[i][4] = bag[i][2] + bag[j][1];
40                     c[i][4] = c[i][2] + bag[j][1]*p[j];
41                 }
42             }
43         }
44     }
45     for(i = 1; i <= num-1; i ++)
46     {
47         for(j = n; j >= bag[que[i]][1]; j --)
48         {
49             for(k = 1; k <= 4; k ++)
50             {
51                 if(j-bag[que[i]][k] >= 0&&v[j] < v[j-bag[que[i]][k]]+c[que[i]][k])
52                     v[j] = v[j-bag[que[i]][k]]+c[que[i]][k];
53             }
54         }
55     }
56     printf("%d\n",v[n]*10);
57     return 0;
58 }

 

 

posted @ 2012-09-05 20:10  Naix_x  阅读(300)  评论(0编辑  收藏  举报