#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