硬币兑换算法中的递归是如何展开的?
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; ...]
使用计数器数组。
【讨论】:
以上是关于硬币兑换算法中的递归是如何展开的?的主要内容,如果未能解决你的问题,请参考以下文章