动态编程:0/1背包 - 将组合检索为数组

时间:2018-03-02 17:43:47

标签: dynamic-programming memoization knapsack-problem

我从自下而上的迭代方法和使用自上而下的自上而下的递归方法研究动态规划。

我的任务是解决0/1背包问题并成功使用自下而上的方法,但我无法使用自上而下的方法。

使用来自网页(http://www.csl.mtu.edu/cs4321/www/Lectures/Lecture%2017%20-%20Knapsack%20Problem%20and%20Memory%20Function.htm)的信息,我提出了以下伪代码,该伪代码可成功计算最佳解决方案的。我的问题是我无法想出一种方法来跟踪构成此解决方案的项目的正确组合。

// 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

我无法弄清楚如何找出输入项的哪些组合会给我返回的优化值?

1 个答案:

答案 0 :(得分:1)

您希望最多返回两种情况: (1)包括第n项 (2)不包括的项目

试试这个......

else:
    memo_pad[i][w] = max{values[i] + memo_pad[i-1][w-weights[i]], 
    memo_pad[i-1][w]}