如何通过硬币更改算法展开递归?

时间:2017-03-11 06:00:14

标签: algorithm recursion dynamic-programming

我知道有很多社论和博客都在解释这个问题,但有一个常见的问题是我遇到了问题。

考虑下面给出的递归:

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

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

但我怀疑是因为有无限的硬币供应,我们可以拿出尽可能多的硬币来实现总和,那么我们如何将这个东西纳入递归解决方案呢?

此外,我无法理解此问题的基本情况!

2 个答案:

答案 0 :(得分:2)

如果有无限的硬币供应,那么给定条件允许排除整个名义上的硬币。例如,解决方案中不再有镍。 clear:both; 数组可能看起来像val

请注意,硬币数量有限的问题稍微复杂一些 - 我们必须使用重复值[1,5,10,25...]来组织数组,或者为每个标称[1,1,1,5,5,10,10,10,10,10,...]的硬币使用计数器数组。

答案 1 :(得分:2)

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

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