公司购物

1、问题描述

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

程序输入:

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

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

程序输出:

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

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

例如:

       输入:

扫描二维码关注公众号,回复: 10481374 查看本文章

2

200

300

则应输出:

2

2  2

5  0

       输入:

2

500

800

则应输出:

1

2  0


2、代码

/*+++++++++++++++++++++++++++++++
+	公司购物
+
+author:zhouyong		2013-5-2 14:01
+++++++++++++++++++++++++++++++++++++*/
#include <stdio.h>
#include <string.h>

int v[10];
int b[10];//每次查找到满足条件的暂存结果
int bc[10][10];//保存最终结果
int c;//记录结果数

void f(int cur,int m,int n);
int main()
{
	int m,i,j;
	scanf("%d",&m);
	for(i=0;i<m;i++)
	{
		scanf("%d",v+i);
	}
	f(0,m,1000);
	printf("%d\n",c);
	for(i=0;i<c;i++)
	{
		for(j=0;j<m;j++)
			printf("%d ",bc[i][j]);
		printf("\n");
	}
	return 0;
}

void f(int cur,int m,int n)
{
	if(cur>=m)
	{
		if (n==0)
		{
			memcpy(bc[c++],b,sizeof(b));
		}
	}
	else
	{
		f(cur+1,m,n);	//不包括v[cur]的情况
		if(n>=v[cur])
		{
			b[cur]++;
			f(cur,m,n-v[cur]);//包含v[cur]的情况
			b[cur]--;		//不包含v[cur]的情况,递归返回恢复b[cur]的之前的情况。
		}
	}
}


发布了35 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ZHOUYONGXYZ/article/details/8875691