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 }

你可能感兴趣的:(ping)