2011年蓝桥杯预赛第九题购物

题目:公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。

程序输入:

第一行是一个整数m,代表可购买的商品的种类数。

接下来是m个整数,每个1行,分别代表这m种商品的单价。

程序输出:

       第一行是一个整数,表示共有多少种方案

       第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。

例如:

       输入:

2

200

300

则应输出:

2

2  2

5  0

       输入:

2

500

800

则应输出:

1

2  0

 

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。

对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

解题思路:用dfs搜索每一种商品可能的购买个数,若刚好用完所有钱,就记录为一种方案。

#include
using namespace std;
const int N = 10005;
int n, cnt = 0, prices[N], Goods[N][N];		//Goods[][]存储具体方案 
void find_plans(int goods, int left){	//goods代表货物种类, left代表剩余钱数 
	if(left <= 0){			//如果剩下的钱<=0, 则进行判断并退出 
		if(!left){
			cnt++;
		}
		return;
	}
	if(goods >= n){			//全部货物都搜索完了, 也退出 
		return;
	}
	for(int i=0; i<=left/prices[goods]; ++i){		//遍历该货物的可能数量 
		Goods[cnt][goods] = i;
		find_plans(goods+1, left-i*prices[goods]);
		Goods[cnt][goods] = 0;
	}
}
int main()
{
	cin >> n;
	for(int i=0; i> prices[i];
	}
	
	find_plans(0, 1000);
	
	cout << cnt << endl;
	for(int i=0; i

 

你可能感兴趣的:(2011年蓝桥杯预赛第九题购物)