动态编程以找到最少数量的硬币

时间:2012-11-07 16:23:02

标签: algorithm dynamic dynamic-programming

我试图理解我作为我的硬件问题的一部分,但它看起来真的像中国......

假设我们有硬币x_1, x_2, x_3, ... x_n。总是x_1 = 1。 我们想用最少数量的硬币给一定数量的钱。 然后我们使用动态编程。

现在我不理解这一点 - c(i,j) = min { c(i-1,j), 1+c(i,j-x_i) } 其中c(i,j)是返回金额j的最小金额。

1 个答案:

答案 0 :(得分:1)

c(i,j-x_i)是仅使用硬币j-x_i获得值i,i+1,...,n的最小硬币数量(这是归纳假设,这是递归公式确保我们的)。
因此,1+c(i,j-x_i)是使用给定的一组硬币获得j-x_i的最小方法+一个价值x_i的额外硬币,我们决定使用它。

由此,c(i,j) = min { c(i-1,j), 1+c(i,j-x_i) }实际上是在详尽地选择“最好的”:

  1. 拿走当前的硬币,然后递归检查其他小问题
  2. 决定不接受它 - 并再次以递归方式检查较小的问题。
  3. 采取最低限度的措施可以确保我们(因为它在所有可能性方面都是彻底完成的)c(i,j)是最小的。