我知道有很多社论和博客都在解释这个问题,但有一个常见的问题是我遇到了问题。
考虑下面给出的递归:
coin_change(coins,i,N) = coin_change(coins,i-1,N) + coin_change(coins,i-1,N-val[i])
现在这看起来非常简单,我认为我们要么排除硬币,要么将其包括在内并解决剩余金额的问题。
但我怀疑是因为有无限的硬币供应,我们可以拿出尽可能多的硬币来实现总和,那么我们如何将这个东西纳入递归解决方案呢?
此外,我无法理解此问题的基本情况!
答案 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:这不是动态编程。