我试图了解硬币更换问题的解决方案,但我有一些困难。硬币更换算法和伪代码:需要澄清
在the Algorithmist,存在用于动态编程溶液的伪溶液,如下所示:
n = goal number
S = [S1, S2, S3 ... Sm]
function sequence(n, m)
//initialize base cases
for i = 0 to n
for j = 0 to m
table[i][j] = table[i-S[j]][j] + table[i][j-1]
这是一个相当标准O(n^2)
算法避免通过使用2-d阵列多次重新计算相同的答案。
我的问题是双重的:
- 如何定义基例和在
table[][]
其纳入作为初始值 - 如何从表中提取出不同的序列
关于问题1,该算法有三种基本情况:
if n==0, return 1
if n < 0, return 0
if n >= 1 && m <= 0, return 0
如何将其纳入table[][]
,我不知道。最后,我不知道如何从数组中提取出解决方案。
感谢您的澄清。两点:“calc”究竟来自哪里?作为一个布尔条件,哪里死了它被设置为false?其次,作为一个二维数组,我将如何提取可能的序列? – Jason 2013-02-09 01:21:16
@Jason:'calc'是一个布尔类型的矩阵,它表示这个“子问题”是否已经被计算过,如果是,那么我们不需要重新计算它,我们可以使用前面的计算结果。这是动态编程的核心 – derekhh 2013-02-09 06:46:32
@Jason:虽然提取可能的序列是一个完全不同的问题,因为可能性的数量可能相当大,但仍然可以使用矢量 v [i] [j]来跟踪它,类似的关系。 –
derekhh
2013-02-09 06:49:15