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 }
posted @ 2012-08-11 15:36  Naix_x  阅读(336)  评论(0编辑  收藏  举报