和多校上的黄金矿工很类似,貌似这个还简单点,每个主件,最多有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 }