POJ 1170 Shopping Offers(01背包)
好繁琐,想了好半天,开始以为暴搜。。比赛时一直卡这个题了,暴搜不出结果换了一个5维背包。。。瞎改一下过了,样例。。。交WA。。再改还是WA。。。
自己对背包,理解的太肤浅啊。。。其实我也不知道为什么过,在多次,WA后,正着写就A了,倒着写就是WA。。。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 int p[6],o[6],kk[1001]; 6 int cl[3001][6],vl[3001]; 7 int q[6][6][6][6][6]; 8 int main() 9 { 10 int c,k,v,s,i,j,a,b,n; 11 int a1,a2,a3,a4,a5; 12 scanf("%d",&b); 13 for(i = 1; i <= b; i ++) 14 { 15 scanf("%d%d%d",&c,&k,&v); 16 kk[c] = i; 17 p[i] = v; 18 o[i] = k; 19 } 20 scanf("%d",&s); 21 for(i = 1; i <= s; i ++) 22 { 23 scanf("%d",&j); 24 for(k = 1; k <= j; k ++) 25 { 26 scanf("%d%d",&c,&a); 27 cl[i][kk[c]] = a; 28 } 29 scanf("%d",&vl[i]); 30 } 31 n = s; 32 for(a1 = 0;a1 <= o[1];a1 ++) 33 { 34 for(a2 = 0;a2 <= o[2];a2 ++) 35 { 36 for(a3 = 0;a3 <= o[3];a3 ++) 37 { 38 for(a4 = 0;a4 <= o[4];a4 ++) 39 { 40 for(a5 = 0;a5 <= o[5];a5 ++) 41 { 42 q[a1][a2][a3][a4][a5] = a1*p[1]+a2*p[2]+a3*p[3]+a4*p[4]+a5*p[5]; 43 } 44 } 45 } 46 } 47 } 48 for(i = 1;i <= n;i ++) 49 { 50 for(a1 = cl[i][1];a1 <= o[1]; a1 ++)//比赛的时候逆着写怎么都不对。。 51 { 52 for(a2 = cl[i][2];a2 <= o[2]; a2 ++) 53 { 54 for(a3 = cl[i][3];a3 <= o[3];a3 ++) 55 { 56 for(a4 = cl[i][4];a4 <= o[4]; a4 ++) 57 { 58 for(a5 = cl[i][5];a5 <= o[5];a5 ++) 59 { 60 if(q[a1][a2][a3][a4][a5] > q[a1-cl[i][1]][a2-cl[i][2]][a3-cl[i][3]][a4-cl[i][4]][a5-cl[i][5]]+vl[i]) 61 q[a1][a2][a3][a4][a5] = q[a1-cl[i][1]][a2-cl[i][2]][a3-cl[i][3]][a4-cl[i][4]][a5-cl[i][5]]+vl[i]; 62 } 63 } 64 } 65 } 66 } 67 } 68 printf("%d\n",q[o[1]][o[2]][o[3]][o[4]][o[5]]); 69 return 0; 70 }