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 }

 

 

你可能感兴趣的:(OS)