硬币找零问题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