【发布时间】:2018-03-02 17:43:46
【问题描述】:
我一直在研究动态编程,从自下而上的迭代方法和使用记忆的自上而下的递归方法。
我的任务是解决 0/1 背包问题,并成功使用了自下而上的方法,但无法使用自上而下的方法。
使用来自网页的信息(http://www.csl.mtu.edu/cs4321/www/Lectures/Lecture%2017%20-%20Knapsack%20Problem%20and%20Memory%20Function.htm) 我想出了以下伪代码,它成功地计算出最佳解决方案的 Value。我的问题是我想不出一种方法来跟踪构成此解决方案的项目的正确组合。
// values array containing the "profits" of each item
// weights array containing the "weight" of each item
// memo_pad is a list used to memoize recursive results
values[], weights[], memo_pad[]
knapsack_memoized(i, w):
// i is the current item
// w is the remaining weight allowed in the knapsack
if memo_pad[i][w] < 0: // if value not memoized
if w < weights[i]:
memo_pad[i][w] = knapsack_memoized(i-1, w)
else:
memo_pad[i][w] = max{knapsack_memoized(i-1,w), values[i]+knapsack_memoized(i-1, w-weights[i])}
return memo_pad[i][w]
end
我不知道如何找出输入项的哪种组合会给我返回的优化值?
【问题讨论】:
-
您忘记了索引结束的基本情况。
标签: dynamic-programming memoization knapsack-problem