硬币兑换算法中的递归是如何展开的?

Posted

技术标签:

【中文标题】硬币兑换算法中的递归是如何展开的?【英文标题】:How does the recursion unfolds in coin changing algorithm? 【发布时间】:2017-03-11 06:00:13 【问题描述】:

我知道有大量的社论和博客对此进行了解释,但有一个共同点让我陷入困境。

考虑下面给出的递归:

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

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

但我的疑问是,由于硬币的供应是无限的,我们可以尽可能多地取硬币来求和,那么我们如何将这个东西纳入递归解决方案?

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

【问题讨论】:

【参考方案1】:

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

以 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:这不是动态编程。

【讨论】:

【参考方案2】:

如果有无限的硬币供应,那么给定条件允许排除整个名义硬币。例如,溶液中不再有镍。 val 数组可能看起来像 [1,5,10,25...]

请注意,硬币数量有限的问题稍微复杂一些 - 我们必须组织具有重复值 [1,1,1,5,5,10,10,10,10,10,...] 的数组,或者为每个名义上的硬币 [1:3; 5:0; 10:12; ...] 使用计数器数组。

【讨论】:

以上是关于硬币兑换算法中的递归是如何展开的?的主要内容,如果未能解决你的问题,请参考以下文章

Ex 6_17 数量无限的硬币兑换问题_第七次作业

数据结构与算法(12)—分治策略

破解大厂最难算法命面试:动态规划之硬币兑换

数据结构与算法之深入解析“零钱兑换”的求解思路与算法示例

LeetCode每周算法零钱兑换

LeetCode每周算法零钱兑换