标签:
Shopping Offers
在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z 。为了吸引更多的顾客,商店举行了促销活动。
促销活动把一个或多个商品组合起来降价销售,例如:
三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是 12z。 编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。
对于上面的商品信息,购买三朵花和两个花瓶的最少花费的方案是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)。
PROGRAM NAME: shopping
INPUT FORMAT:
(file shopping.in)
输入文件包括一些商店提供的优惠信息,接着是购物清单。(最多有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 个商品。
OUTPUT FORMAT:
(file shopping.out)
只有一行,输出一个整数:购买这些物品的最低价格。
2 1 7 3 5 2 7 1 8 2 10 2 7 3 2 8 2 5
14
分析:
d[a1][a2][a3][a4][a5] 表示第 1 个物品买 a1 个,第 2 个物品买 a2 个,第 3 个物品买 a3 个,第 4 个物品买 a4 个,第 5 个物品买 a5 个的最小值。d[a1][a2][a3][a4][a5]=min(d[a1-b1][ a2-b2][ a3-b3][ a4-b4][ a5-b5] + reduce[i] );
b1、b2、b3、b4、b5 表示按照某打折方式各个物品需要要买的物品数目。
p[i][j] 表示第 i 个打折方式,所需要购买物品 j 的数量(j是那个物品的号码)
代码:
/* ID:Andy Chen LANG: C++ TASK: shopping */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int d[6][6][6][6][6],p[100][1000],num[100],reduce[100]; struct product { int c,k,r; }a[6]; int main() { freopen("shopping.in","r",stdin); freopen("shopping.out","w",stdout); int s,n,i,j,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5; while(scanf("%d",&s)==1) { memset(p,0,sizeof(p)); for(i=0;i<6;i++) a[i].c=a[i].k=0; for(i=1;i<=s;i++) { scanf("%d",&num[i]); for(j=1;j<=num[i];j++) { scanf("%d%d",&a1,&a2); p[i][a1]=a2; } scanf("%d",&reduce[i]); } scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d%d%d",&a[i].c,&a[i].k,&a[i].r); } d[0][0][0][0][0]=0; for(a1=0;a1<=a[1].k;a1++) for(a2=0;a2<=a[2].k;a2++) for(a3=0;a3<=a[3].k;a3++) for(a4=0;a4<=a[4].k;a4++) for(a5=0;a5<=a[5].k;a5++) { d[a1][a2][a3][a4][a5]=a1*a[1].r+a2*a[2].r+a3*a[3].r+a4*a[4].r+a5*a[5].r;//按照原价 for(i=1;i<=s;i++) { if(num[i]>n) continue; b1=a1-p[i][a[1].c]; b2=a2-p[i][a[2].c]; b3=a3-p[i][a[3].c]; b4=a4-p[i][a[4].c]; b5=a5-p[i][a[5].c]; if(b1<0||b2<0||b3<0||b4<0||b5<0) continue;
//<0就是不合法状态了
d[a1][a2][a3][a4][a5]=min(d[a1][a2][a3][a4][a5],d[b1][b2][b3][b4][b5]+reduce[i]); } } cout<<(d[a[1].k][a[2].k][a[3].k][a[4].k][a[5].k])<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/cherry231/p/5191516.html