USACO3.32Shopping Offers(DP)

五维DP,听着挺多的,貌似就是挺裸的dp,

最近貌似做简单的DP挺顺手。。1A

dp[i][j][e][o][g] = min(dp[i][j][e][o][g],dp[i-i1][j-i2][e-i3][o-i4][g-i5]+p[q])  i1,i2...为满足给出的商品数量的值 p[q]为选用当前优惠方案的价格。

 1 /*

 2     ID: shangca2

 3     LANG: C++

 4     TASK: shopping

 5  */

 6 #include <iostream>

 7 #include<cstdio>

 8 #include<cstring>

 9 #include<algorithm>

10 #include<stdlib.h>

11 using namespace std;

12 #define INF 0xfffffff

13 int dp[6][6][6][6][6];

14 struct node

15 {

16     int c[6],k[6],p,n;

17 }pp[110];

18 int c[6],k[6],p[6];

19 int main()

20 {

21     freopen("shopping.in","r",stdin);

22     freopen("shopping.out","w",stdout);

23     int i,j,s,b,e,o,g,q,a;

24     for(i =0 ; i <= 5 ; i++)

25         for(j = 0 ; j <= 5 ; j++)

26             for(e = 0 ; e <= 5 ; e++)

27                 for(o = 0 ; o <= 5 ; o++)

28                     for(g = 0 ; g <= 5 ; g++)

29                     dp[i][j][e][o][g] = INF;

30     cin>>s;

31     for(i = 1; i <= s ; i++)

32     {

33         cin>>pp[i].n;

34         for(j = 1; j <= pp[i].n ; j++)

35         cin>>pp[i].c[j]>>pp[i].k[j];

36         cin>>pp[i].p;

37     }

38     cin>>b;

39     for(i =  1; i <= b ;i++)

40     cin>>c[i]>>k[i]>>p[i];

41     for(i = 0 ;i <= k[1] ; i++)

42     for(j = 0; j <= k[2] ; j++)

43     for(e = 0; e <= k[3] ; e++)

44     for(o = 0 ; o <= k[4] ;o++)

45     for(g = 0 ; g <= k[5] ; g++)

46     {

47         dp[i][j][e][o][g] = i*p[1]+j*p[2]+e*p[3]+o*p[4]+g*p[5];

48         for(q = 1; q <= s ; q++)

49         {

50             int i1=0,i2=0,i3=0,i4=0,i5=0;

51             for(a = 1; a <= pp[q].n ;a++)

52             {

53                 if(pp[q].c[a]==c[1])

54                 i1 = pp[q].k[a];

55                 else if(pp[q].c[a]==c[2])

56                 i2 = pp[q].k[a];

57                 else if(pp[q].c[a]==c[3])

58                 i3 = pp[q].k[a];

59                 else if(pp[q].c[a]==c[4])

60                 i4 = pp[q].k[a];

61                 else

62                 i5 = pp[q].k[a];

63             }

64             if(i-i1>=0&&j-i2>=0&&e-i3>=0&&o-i4>=0&&g-i5>=0)

65             {

66                 dp[i][j][e][o][g] = min(dp[i][j][e][o][g],dp[i-i1][j-i2][e-i3][o-i4][g-i5]+pp[q].p);

67             }

68         }

69     }

70     cout<<dp[k[1]][k[2]][k[3]][k[4]][k[5]]<<endl;

71     return 0;

72 }
View Code

 

你可能感兴趣的:(USACO)