硬币改变记忆

时间:2013-04-14 09:38:23

标签: algorithm dynamic memoization

以下算法是否确实找到了对特定和进行更改的所有可能方法?是否真的使用了memoization?

func count( n, m )
  for i from 0 to n
    for j from 0 to m
      if i equals 0
        table[i,j] = 1          
      else if j equals 0
        table [i,j] = 0
      else if S_j greater than i
        table[ i, j ] = table[ i, j - 1 ]
      else 
        table[ i, j ] = table[ i - S_j, j ] + table[ i, j - 1 ]
return table[ n, m ]

每次调用函数计数时,它都会从头开始填充表。即使表已经针对某些值进行了初始化,下次调用计数时,它也不会使用这些值,而是会从i = 0和j = 0再次开始。

1 个答案:

答案 0 :(得分:1)

这不是Memoization。这是动态编程代码的一个示例。

为了分析您的代码,首先我们需要区分Memoization和Dynamic Programming。

Memoization是一种自上而下的方法,动态编程是一种自下而上的方法。

考虑找到数字 n 的阶乘的问题。

如果你找到了n!通过使用以下事实,

n! = n * (n-1)! and 0!=1

这是自上而下方法的一个例子。

n的值保留在内存中,直到值为0!到(n-1)!被退回。缺点是你浪费了大量的堆栈内存。优点是,如果子问题已经解决,则不必重新计算子问题。子问题的解决方案存储在内存中。

但是在你的问题中,你没有自上而下的方法,因此没有记忆。

表中的每个条目都是直接从先前计算的子问题解决方案中获得的。因为它使用自下而上的方法。因此,您有一段使用动态编程的代码。