我对理解各种问题的动态规划解决方案有困难,特别是硬币找零问题:
“给定一个价值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/
谢谢。我去的每个网站都只解释了解决方案的工作原理,却没有解释其他解决方案为什么不起作用。