对于硬币问题的动态编程技术矩阵应该是什么样子我很困惑。 假设我有1c,5c,10c和25c的面额,我称之为生产变更(10)。即我想换10美分,我的最终矩阵/阵列应该是什么样的。我需要知道这一点,因为我想在程序的开头分配一个数组。我不是在这里寻找代码。
答案 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
的答案时,你知道:
x
的方式数量 - 这是x
,因为我们仍然没有覆盖它; 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)
...
}