如果我使用动态编程来解决硬币变化,矩阵将用于记忆化的内容是什么?

时间:2012-10-02 20:22:51

标签: algorithm dynamic-programming coin-change

对于硬币问题的动态编程技术矩阵应该是什么样子我很困惑。 假设我有1c,5c,10c和25c的面额,我称之为生产变更(10)。即我想换10美分,我的最终矩阵/阵列应该是什么样的。我需要知道这一点,因为我想在程序的开头分配一个数组。我不是在这里寻找代码。

2 个答案:

答案 0 :(得分:2)

你可以使用一个矩阵,其中一个维度显示你现在正在计算的总和,另一个显示你可以使用哪些硬币 - 例如,第一行显示使用给定总和的方式数量仅1c硬币,第二行--1c和5c,第三行--1c,5c和10c等。

所以在你的例子中,它看起来像这样:

Sum:  0 1 2 3 4 5 6 7 8 9 10
Ways: 1 1 1 1 1 1 1 1 1 1 1   (using only 1c coins - N x 1c)
      1 1 1 1 1 2 2 2 2 2 3   (using 1c and 5c coins - either Nx1c, 1x5c + (N - 5)*1c or 2x5c)
      1 1 1 1 1 2 2 2 2 2 4   (using 1c, 5c and 10c coins - one of the above, or 1x10c)

你真的不需要存储整个矩阵 - 最后一行应该总是足够的。

解除大部分矩阵的解释:

假设您在仅使用1c硬币(这不是一件非常难的事情)时找到了答案,并将其存储在一个数组中,比如DP。现在,您有这些信息,并且您想知道1c和5c硬币的答案。

您可以从sum = 0 to 10继续,保持以下不变量:

  • 当您计算sum的答案时,DP中0到x之间的每个数字sum - 1的条目显示获取{的方式数量{ {1}}使用1c和5c硬币。所有其他条目(从sum到数组的末尾)仅包含使用1c硬币时的答案。

保持它实际上非常简单:当你计算sum的答案时,你知道:

  • 仅使用1c硬币获取x的方式数量 - 这是x,因为我们仍然没有覆盖它;
  • 使用至少一个5c硬币获得DP[x]的方式的数量 - 即x,即获取5c后剩余硬币数量的方式数量(或0,如果DP[x - 5])。

然后你可以将这两个数字相加并将结果存储在x - 5 < 0中。然后类似地继续其余的硬币。

答案 1 :(得分:0)

我认为一个将金额映射到硬币列表的散列图。所以它看起来像:

{0 => (),
 1 => (1),
 2 => (1,1),
 3 => (1,1,1),
 ...
 13 => (10,1,1,1)
 ...
}