繁体   English   中英

想知道有多少种方法可以在硬币兑换中求和?

[英]Finding number of ways to make a sum in coin changing?

给定一个值 N,如果我们想找零 N 美分,并且我们有无限供应的每个 S = { S1, S2, .. , Sm} 价值的硬币,我们有多少种找零的方法? 硬币的顺序无关紧要。

例如,对于 N = 4 和 S = {1,2,3},有四种解决方案:{1,1,1,1},{1,1,2},{2,2},{1, 3}。 所以output应该是4。对于N = 10和S = {2, 5, 3, 6},有五种解决方案:{2,2,2,2,2},{2,2,3,3}, {2,2,6}、{2,3,5} 和 {5,5}。 所以 output 应该是 5。

现在,我有一个疑问。 为什么我们不能做类似的事情,

arr[i] = arr[i-1] + arr[i-2] + arr[i-3]

这基本上是arr[i]存储总和i的方法数。 我在这里给出的方法有点类似于n stairs problem ,即我可以爬固定数量的阶梯,也就是说,一次爬 1 个阶梯或一次 2 个阶梯,我必须计算总数从底部到达顶部的方法。 为什么我们不能在这个问题上使用类似的方法?

为什么我们不能在这个问题中使用类似的方法?

它不起作用,因为在n阶梯问题中,顺序很重要。 例如,如果你爬5级楼梯,{1,2,1,1}被计为与{1,1,2,1}不同。

然而,在制作更改问题中,只有每个硬币的总计数,而不是你添加它们的顺序,所以如果你赚5美元,{$ 1,$ 2,$ 1,$ 1}与{$ 1,$ 1,$ 2,$ 1相同}。 因此,简单的记忆方法不起作用,您需要存储所有可能的方法来达到arr [i],而不仅仅是总数。

例如,假设你试图用$ 1和$ 2赚6美元。 你不能只是为赚5美元的方式增加赚4美元的方式,因为(例如)制作4美元的方法之一是{$ 1,$ 1,$ 2}(你可以加2美元到赚$ 6即{$ 1,$ 1,$ 2,$ 2}),其中一种赚5美元的方式是{$ 1,$ 2,$ 2}(你可以加1美元赚6美元{$ 1,$ 2,$ 2,$ 1}) 。

但是,{$ 1,$ 2,$ 2,$ 1}和{$ 1,$ 1,$ 2,$ 2}不应单独计算。

Samgak的回答解释了如何使改变与攀爬楼梯一步一步或两步不同:订单与改变无关,但是当你爬楼梯时,订单很重要。

您可以使用动态编程来解决问题,但需要更复杂的状态。 a[i][j]是仅使用硬币的前j面币来改变i单位货币的方法的数量。 因此,对于大于0的a[0][0]=1a[i][0] = 0对于大于0的j, a[i][j] = a[i][j-1] + a[i-Sj][j-1] + a[i-2*Sj][j-1]+...

为什么我们不能在这个问题中使用类似的方法?

这里详细解释一下,为什么这个思路行不通 - https://youtu.be/1P04Pf5RtEM

确实,这可能是我们的第一个预感,但它有一个问题。

考虑一个示例 {1,2,3} 是面额,所需的总和是 4。现在,假设我们一个接一个地挑选硬币。 看起来我们的答案 f(4) 应该是 f(4-1) + f(4-2) + f(4-3)。

f(4-1) 是什么意思? 它代表了我们可以制作 3 的方法的数量。其中一种方法是捡起 3 卢比的硬币。 因此,制作 4 的方法之一是挑选 Re 1 硬币,然后挑选 Rs 3 硬币。

f(4-3) 是什么意思? 它表示我们可以制造 1 的方法的数量。其中一种方法是捡起 Re 1 硬币。 因此,制作 4 的方法之一是选择 3 卢比的硬币,然后选择 Re 1 的硬币。

现在,两者之间有什么区别吗? 不,因为两者都代表拿起 1 Re 1 硬币和 1 Rs 3 硬币。 但是,我们会将这两种方式算作两种不同的方式,这是不正确的。 因此,通过这种方式,简单地使用较小问题的答案来推导出较大问题的答案并不简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM