对于硬币找零问题(动态编程方法),递归关系中的+1意味着什么?

时间:2019-05-01 12:37:17

标签: algorithm dynamic-programming greedy coin-change

我看到硬币找零问题。通常,输入为 n (要返回的找零),并且可用面额(以分表示的硬币值) v 1 2 1 <... k ;我们的目标是使用最少的硬币数量以 n 美分进行兑换。

我从哥伦比亚大学读this pdf,但我不知道为什么在幻灯片6处,递归关系中有 +1

enter image description here

它代表我们已经使用过的硬币吗?

2 个答案:

答案 0 :(得分:0)

假设我的教派看起来像这样:d = [1, 5, 10, 25]。我们还假设要返回的更改n为26。这意味着:

C[26] = min{C[26 - d[i]] + 1}

可以表示为:

C[26] = min{C[25], C[21], C[16], C[1]} + 1

这里的“ +1”只是您需要添加到先前解决的子问题之一(例如C [25],C [21])中以获得C [26]的硬币。

如果我们考虑一个更简单的示例(例如n = 6且面额相同),我们知道重复将是:

C[6] = min{C[6 - d[i]]} + 1

或:

C[6] = min{C[5], C[1]} + 1

我们知道C [5]为1(因为在混合货币中面额为5的最小赚取5分的方法是1),并且类似地,C [1] =1。这里的最小值仅为1,所以1 +1 = 2,赚6美分所需的最小硬币数量为2个硬币。

答案 1 :(得分:0)

C[p]表示从可用硬币阵列d中构建面额p的最小硬币数量。

因此,要创建这样的总和,您必须选择d[i]这样的硬币d[i]<p

让我们假设您从d中挑选了一个硬币d [i]。这意味着您现在的硬币数是一个。

现在要使总和为p,请为总和p-d[i]收集更多硬币。

但是您确实已经需要min_coins才能在p-d[i]中产生总和C[p-d[i]]

这意味着使总和为p的一种可能的硬币计数为1+C[p-d[i]]

但是在d[i]<p可能存在多种面额的情况下,那么您必须选择一种最小化结果的面额,这正是您的职能所在。

通过这种方式,您可以了解+1的作用是我们考虑用来制作总金额p的第一枚硬币。