购物卷购物问题

本文介绍了一种通过递归算法解决特定购物券消费组合的问题,旨在找出所有可能的消费方式,使得购物券金额恰好被完全使用。输入为若干种商品的价格及购物券总额,输出为所有可行的购买组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

程序输入:

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

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

程序输出:

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

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

例如:

输入:

2

200

300

则应输出:

2

2  2

5  0

输入:

2

500

800

则应输出:

1

2  0

代码如下:

#include<stdio.h>
int M[2][1000];//M[0][i]保存商品价格,M[1][i]保存相应商品的购买数量
int temp[1000][1000];//temp[i][j]表示第i个方案各种商品的购买情况
int count;//统计方案个数
void fun(int sum,int m,int i)//递归求解
{
	if (sum == 1000)//如果满足,则保存到temp数组中
	{	
		for (int j = 0; j < m; j++)
		{
			temp[count][j] = M[1][j];
		}
		count++;
	}	
	else if (sum > 1000 || i == m)//超支或越界则返回
	{
		return;
	}
	else
	{
		int x = 0;//便于计算0的情况
		for (int k = 0; k <= 1000 / M[0][i]; k++)//每种商品最多可以买多少个
		{
			sum += x;
			if (x)
			{
				M[1][i]++;
			}			
			fun(sum,m,i + 1);//下一个商品的购买情况
			if (sum >= 1000 || k == 1000 / M[0][i])//方案不满足时,之前购买的记录归零
			{
				M[1][i] = 0;
				break;
			}
			x = M[0][i];
		}
	}
}
int main()
{
	int m,i,j;
	scanf("%d",&m);
	for (i = 0; i < m; i++)//输入各商品价格
	{
		scanf("%d",&M[0][i]);
	}
	fun(0,m,0);
	printf("%d\n",count);
	for (i = 0; i < count; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%d ",temp[i][j]);
		}
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值