Shopping Offers

                        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)

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

[编辑]SAMPLE INPUT

2
1 7 3 5
2 7 1 8 2 10
2
7 3 2
8 2 5

[编辑]SAMPLE OUTPUT

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; }

 

你可能感兴趣的:(Shopping Offers)