3.3.2 Shopping Offers 商店购物
时间: 1ms 内存:64M
描述:
在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z 。为了吸引更多的顾客,商店举行了促销活动。
促销活动把一个或多个商品组合起来降价销售,例如:
三朵花的价格是 5z 而不是 6z,
两个花瓶和一朵花的价格是 10z 而不是 12z。
编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。对于上面的商品信息,购买三朵花和两个花瓶的最少花费是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)。
输入:
输入文件包括一些商店提供的优惠信息,接着是购物清单。
第一行 优惠商品的种类数(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 个商品。
输出:
只有一行,输出一个整数:购买这些物品的最低价格。
示例输入:
2
1 7 3 5
2 7 1 8 2 10
2
7 3 2
8 2 5
示例输出:
14
提示:
参考答案(内存最优[1688]):
#include <iostream>
using namespace std;
typedef struct
{
int k[1000];
int p;
}profit;
typedef struct
{
int c;
int k;
int p;
}price;
profit pro[100];
price pri[6];
int s,n,c,b;
int dp[6][6][6][6][6];
int main()
{
int mrki,mrkj,mrkk,mrkl,mrkm,mrkn;
cin>>s;
for(mrki=1;mrki<=s;mrki++)
{
cin>>n;
for(mrkj=1;mrkj<=n;mrkj++)
{
cin>>c;
cin>>pro[mrki].k[c];
}
cin>>pro[mrki].p;
}
cin>>b;
for(mrki=1;mrki<=b;mrki++)
{
s++;
cin>>pri[mrki].c>>pri[mrki].k>>pro[s].p;
pro[s].k[pri[mrki].c]=1;
}
for(mrki=0;mrki<6;mrki++)
for(mrkj=0;mrkj<6;mrkj++)
for(mrkk=0;mrkk<6;mrkk++)
for(mrkl=0;mrkl<6;mrkl++)
for(mrkm=0;mrkm<6;mrkm++)
dp[mrki][mrkj][mrkk][mrkl][mrkm]=2100000000;
dp[0][0][0][0][0]=0;
for(mrki=1;mrki<=s;mrki++)
for(mrkj=pro[mrki].k[pri[1].c];mrkj<=pri[1].k;mrkj++)
for(mrkk=pro[mrki].k[pri[2].c];mrkk<=pri[2].k;mrkk++)
for(mrkl=pro[mrki].k[pri[3].c];mrkl<=pri[3].k;mrkl++)
for(mrkm=pro[mrki].k[pri[4].c];mrkm<=pri[4].k;mrkm++)
for(mrkn=pro[mrki].k[pri[5].c];mrkn<=pri[5].k;mrkn++)
if(dp[mrkj][mrkk][mrkl][mrkm][mrkn]>dp[mrkj-pro[mrki].k[pri[1].c]][mrkk-pro[mrki].k[pri[2].c]][mrkl-pro[mrki].k[pri[3].c]][mrkm-pro[mrki].k[pri[4].c]][mrkn-pro[mrki].k[pri[5].c]]+pro[mrki].p)
dp[mrkj][mrkk][mrkl][mrkm][mrkn]=dp[mrkj-pro[mrki].k[pri[1].c]][mrkk-pro[mrki].k[pri[2].c]][mrkl-pro[mrki].k[pri[3].c]][mrkm-pro[mrki].k[pri[4].c]][mrkn-pro[mrki].k[pri[5].c]]+pro[mrki].p;
cout<<dp[pri[1].k][pri[2].k][pri[3].k][pri[4].k][pri[5].k]<<endl;
return 0;
}
参考答案(时间最优[20]):
#include <iostream>
using namespace std;
typedef struct
{
int k[1000];
int p;
}profit;
typedef struct
{
int c;
int k;
int p;
}price;
profit pro[100];
price pri[6];
int s,n,c,b;
int dp[6][6][6][6][6];
int main()
{
int mrki,mrkj,mrkk,mrkl,mrkm,mrkn;
cin>>s;
for(mrki=1;mrki<=s;mrki++)
{
cin>>n;
for(mrkj=1;mrkj<=n;mrkj++)
{
cin>>c;
cin>>pro[mrki].k[c];
}
cin>>pro[mrki].p;
}
cin>>b;
for(mrki=1;mrki<=b;mrki++)
{
s++;
cin>>pri[mrki].c>>pri[mrki].k>>pro[s].p;
pro[s].k[pri[mrki].c]=1;
}
for(mrki=0;mrki<6;mrki++)
for(mrkj=0;mrkj<6;mrkj++)
for(mrkk=0;mrkk<6;mrkk++)
for(mrkl=0;mrkl<6;mrkl++)
for(mrkm=0;mrkm<6;mrkm++)
dp[mrki][mrkj][mrkk][mrkl][mrkm]=2100000000;
dp[0][0][0][0][0]=0;
for(mrki=1;mrki<=s;mrki++)
for(mrkj=pro[mrki].k[pri[1].c];mrkj<=pri[1].k;mrkj++)
for(mrkk=pro[mrki].k[pri[2].c];mrkk<=pri[2].k;mrkk++)
for(mrkl=pro[mrki].k[pri[3].c];mrkl<=pri[3].k;mrkl++)
for(mrkm=pro[mrki].k[pri[4].c];mrkm<=pri[4].k;mrkm++)
for(mrkn=pro[mrki].k[pri[5].c];mrkn<=pri[5].k;mrkn++)
if(dp[mrkj][mrkk][mrkl][mrkm][mrkn]>dp[mrkj-pro[mrki].k[pri[1].c]][mrkk-pro[mrki].k[pri[2].c]][mrkl-pro[mrki].k[pri[3].c]][mrkm-pro[mrki].k[pri[4].c]][mrkn-pro[mrki].k[pri[5].c]]+pro[mrki].p)
dp[mrkj][mrkk][mrkl][mrkm][mrkn]=dp[mrkj-pro[mrki].k[pri[1].c]][mrkk-pro[mrki].k[pri[2].c]][mrkl-pro[mrki].k[pri[3].c]][mrkm-pro[mrki].k[pri[4].c]][mrkn-pro[mrki].k[pri[5].c]]+pro[mrki].p;
cout<<dp[pri[1].k][pri[2].k][pri[3].k][pri[4].k][pri[5].k]<<endl;
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。