luogu2732商店购物

促销活动把一个或多个商品组合起来降价销售,例如:

三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是 12z。 编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。

对于上面的商品信息,购买三朵花和两个花瓶的最少花费的方案是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)。

输入格式:

输入文件包括一些商店提供的优惠信息,接着是购物清单。(最多有5种商品)

第一行 优惠方案的种类数(0 <= s <= 99)。

第二行..第s+1 行 每一行都用几个整数来表示一种优惠方式。第一个整数 n (1 <= n <= 5),表示这种优惠方式由 n 种商品组成。后面 n 对整数 c 和 k 表示 k (1 <= k <= 5)个编号为 c (1 <= c <= 999)的商品共同构成这种优惠,最后的整数 p 表示这种优惠的优惠价(1 <= p <= 9999)。优惠价总是比原价低。

第 s+2 行 这一行有一个整数 b (0 <= b <= 5),表示需要购买 b 种不同的商品。

第 s+3 行..第 s+b+2 行 这 b 行中的每一行包括三个整数:c,k,p。 c 表示唯一的商品编号(1 <= c <= 999),k 表示需要购买的 c 商品的数量(1 <= k <= 5)。p 表示 c 商品的原价(1 <= p <= 999)。最多购买 5*5=25 个商品。

输出格式:

只有一行,输出一个整数:购买这些物品的最低价格。

五维dp

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+5;
 4 const int INF=1e9+7;
 5 int s,c,k,b,p,v[1005],tot,x[10],f[6][6][6][6][6];
 6 struct A
 7 {
 8     int n,p;
 9     int k[10];
10 }g[205];
11 template <class t>void red(t &x)
12 {
13     x=0;
14     int w=1;
15     char ch=getchar();
16     while(ch<'0'||ch>'9')
17     {
18         if(ch=='-')
19             w=-1;
20         ch=getchar();
21     }
22     while(ch>='0'&&ch<='9')
23     {
24         x=(x<<3)+(x<<1)+ch-'0';
25         ch=getchar();
26     }
27     x*=w;
28 }
29 void input()
30 {
31     freopen("input.txt","r",stdin);
32 }
33 void read()
34 {
35     red(s);
36     for(int i=1;i<=s;++i)
37     {
38         red(g[i].n);
39         for(int j=1;j<=g[i].n;++j)
40         {
41             red(c);
42             red(k);
43             if(!v[c])
44                 v[c]=++tot;
45             g[i].k[v[c]]=k;
46         }
47         red(g[i].p);
48     }
49     red(b);
50     for(int i=1;i<=b;++i)
51     {
52         red(c);
53         red(k);
54         red(p);
55         if(!v[c])
56             v[c]=++tot;
57         x[v[c]]=k;
58         g[++s].n=1;
59         g[s].k[v[c]]=1;
60         g[s].p=p;
61     }
62 }
63 void work()
64 {
65     for(int a=0;a<=5;++a)
66         for(int b=0;b<=5;++b)
67             for(int c=0;c<=5;++c)
68                 for(int d=0;d<=5;++d)
69                     for(int e=0;e<=5;++e)
70                         f[a][b][c][d][e]=0x3f3f3f3f;
71     f[0][0][0][0][0]=0;
72     for(int i=1;i<=s;++i)
73         for(int a=g[i].k[1];a<=x[1];++a)
74             for(int b=g[i].k[2];b<=x[2];++b)
75                 for(int c=g[i].k[3];c<=x[3];++c)
76                     for(int d=g[i].k[4];d<=x[4];++d)
77                         for(int e=g[i].k[5];e<=x[5];++e)
78                             f[a][b][c][d][e]=min(f[a][b][c][d][e],f[a-g[i].k[1]][b-g[i].k[2]][c-g[i].k[3]][d-g[i].k[4]][e-g[i].k[5]]+g[i].p);
79     printf("%d\n",f[x[1]][x[2]][x[3]][x[4]][x[5]]);
80 }
81 int main()
82 {
83     //input();
84     read();
85     work();
86     return 0;
87 }
View Code

 

posted @ 2019-05-10 14:36  Achen_sy  阅读(217)  评论(0编辑  收藏  举报