algorithm - 递归在换币算法中是如何展开的?

标签 algorithm recursion dynamic-programming

我知道有大量的社论和博客解释这一点,但有一个共同点让我感到困惑。

考虑下面给出的递归:

coin_change(coins,i,N) = coin_change(coins,i-1,N) + coin_change(coins,i-1,N-val[i])

现在这看起来很简单,我认为我们要么排除硬币,要么包括它并解决剩余金额的问题。

但我的疑问是,既然有无限供应的硬币,我们可以取尽可能多的硬币来达到总和,那么我们如何将那个东西合并到递归解决方案中呢?

我也无法理解这个问题的基本情况!

最佳答案

这将创建一个二叉树,其中右分支一次又一次地搜索减去相同的硬币,左分支搜索所有其他硬币。

以 N = 3 和硬币 = {1, 2} 的简单情况为例:
右边的分支是:

{1,2}: 1->1->1  (1,1,1)
  {2}:  ->2     (1,2)

左边的分支是:

{2}:    2->X    (No solution)

如果 2 是第一个硬币,将给出相同的结果:
右手分支:

{2,1}: 2->X     (No solution)
  {1}   ->1     (2,1)

左手分支:

{1}:   1->1->1  (1,1,1)

注意 1:你不应该在第二次调用时有 -1:

coin_change(coins,i,N) = coin_change(coins,i-1,N) + coin_change(coins,i,N-val[i])

注2:这不是动态规划。

关于algorithm - 递归在换币算法中是如何展开的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42731918/

相关文章:

c - 如果 Arduino 的库有 32 位限制,我如何在 Arduino 上输出 64 位数字?

algorithm - 在二叉树中找到最大的不相交叶到叶路径之和

c++ - 找出两个数字桶之间的最短距离

algorithm - 拓扑搜索和广度优先搜索

algorithm - 斐波那契堆 : Insertion, Extract-Min 和性能?

c++ - 递归函数中的段错误 C++

algorithm - 递归调车场算法

java - 有 2 个约束的背包

c++ - 使用内存的最长公共(public)子序列

algorithm - 找到子集的数量,即剩余数字的 xor 等于 0