3.3.2 Shopping Offers 商店购物

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

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注