我在理解各种问题的动态编程解决方案方面遇到问题,特别是硬币找零问题:
“给定一个值 N,如果我们想找 N 美分,并且我们有无限供应 S = { S1, S2, .. , Sm} 价值的硬币,我们有多少种方法可以找零?顺序硬币没关系。
例如,对于 N = 4 和 S = {1,2,3},有四种解:{1,1,1,1},{1,1,2},{2,2},{1, 3}。所以输出应该是 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}。所以输出应该是 5。”
这个问题还有另一种变体,其中解决方案是满足数量的最小硬币数量。
这些问题看起来非常相似,但解决方案却大不相同。
进行更改的可能方法的数量:对此的最佳子结构是DP(m,n) = DP(m-1, n) + DP(m, n-Sm)其中 DP 是所有硬币的解决方案数第 m 个硬币和金额 = n。
最小硬币数量:最佳子结构是 DP[i] = Min{ DP[i-d1], DP[i-d2],...DP[i-dn] } + 1其中 i 是总金额d1..dn 代表每个硬币面额。
为什么第一个需要二维数组而第二个需要一维数组?为什么改变方法数量的最佳子结构不是“ DP[i] = DP[i-d1]+DP[i-d2]+...DP[i-dn] ”,其中 DP[i] 是i 数量可以通过硬币获得的方式数量。这对我来说听起来合乎逻辑,但它会产生一个不正确的答案。为什么在这个问题中需要硬币的第二维,但在最小数量问题中不需要?
问题链接:
http://comproguide.blogspot.com/2013/12/minimum-coin-change-problem.html http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/
提前致谢。我访问的每个网站都只解释解决方案的工作原理,而不是为什么其他解决方案不起作用。