硬币找零问题

本文探讨了如何利用回溯算法解决硬币找零问题,即给定多种硬币面值和一个目标金额,找出所有可能的组合。通过分析避免重复组合的策略,提出了一种递归解决方案,该方案按硬币面值顺序逐层进行,确保不会错过任何可能的组合。此外,还指出此问题与完全背包问题的联系,并提供了相关代码实现。
摘要由CSDN通过智能技术生成

硬币找零问题1:给定几种硬币的面值,每种硬币数目无限多,给定一个数值,求出用这些已有的硬币加起来组成的价值等于这个数值的所有组合情况

可以用回溯思想来解决此问题,加入硬币为{1,2,5},目标是组成10,我刚开始是想用递归解决,每递归进去一层,都重新从1,2,5中选取一个数,加上之前累加得到的数,判断是否大于或等于10,这个思路是有问题的,会造成重复,比如某次挑选的路径为1,2,5,后来还会出现2,1,5.最终的次数肯定是多出了不少。所以换个思路,每递归进去一层,比如第一层:只用1来组成10,可以用1个1,2个1,3个1.......最多10个1,分别计算出当前累积的数值sum,也就是1,2,3 .....10,传到下一层,第二层需要用10-sum来判断当前可以最多用几个2,每个都采用一次,如此下去,层数是固定的,有几种币值就有几层,也没有重复。

代码如下:

int timesCount = 0;
void ChangeMoney(int money[], int moneyNum, int target,int solusion[], int deepth = 0, int sum = 0)
{
	if(deepth == moneyNum || sum >= target)	//每进去下一层,就多用一种硬币,硬币用完了就结束,钱的总值超过目标也结束
	{
		if(sum == target)	//达到目标机制,输出此次路径,记录次数
		{
			timesCount++;
			cout &l
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值