动态规划--用最少的硬币类别找零钱

#include<iostream>
using namespace std;

//coinNum[i]当前钱为i时需要的最少硬币数
void FindMin(int money,int *coin, int n)
{
	int *coinNum = new int[money+1]();//存储1...money找零最少需要的硬币的个数
	int *coinValue = new int[money+1]();//最后加入的硬币,方便后面输出是哪几个硬币
	
	coinNum [0] = 0;
 
	for(int i = 1;i <= money;i++)
	{
		int minNum = i;//i面值钱,需要最少硬币个数,全部为1时,对应的最大个数
		int usedMoney = 0;//这次找零,在原来的基础上需要的硬币
		
		for(int j = 0; j < n;j++)  //遍历可用的零钱
		{
			if( i >= coin[j])//找零的钱大于这个硬币的面值
			{
				if(coinNum[i-coin[j]] + 1 <= minNum && (i == coin[j] || coinValue[i-coin[j]] != 0))//所需硬币个数减少了
				{
					minNum = coinNum[i-coin[j]] + 1; 
					usedMoney = coin[j]; 
				}
			}
		}
		coinNum[i] = minNum;
		coinValue[i] = usedMoney;   //当钱为i时可以用的钱
	}
 
	//输出结果
	if(coinValue[money] == 0)
		cout<<"找不开零钱"<<endl;
	else
	{
		cout<<"需要最少硬币个数为:"<<coinNum[money]<<endl;
		cout<<"硬币分别为:";
		while(money>0)
		{
			cout << coinValue[money] << ",";
			money -= coinValue[money];
		}
	}
	delete []coinNum;
	delete []coinValue;
}


int main()
{
	int Money = 18;
	int coin[] = {1,2,5,9,10};
	FindMin(Money,coin,5);

	return 0;
}

看上图,总共15元,有{1,5,11}的面值,类似一个地推过程。coinValue[money] == 0表示找不开,如果能找开肯定有值,因为上面usedMoney进行赋值了。

 

 

地址代码:https://blog.csdn.net/kangroger/article/details/36036101#

视频地址:https://haokan.baidu.com/v?vid=2742116767553288532&pd=bjh&fr=bjhauthor&type=video

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值