【问题标题】:Dynamic Programming: 0/1 Knapsack - Retrieving Combinations as array动态规划:0/1 背包 - 将组合检索为数组
【发布时间】: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


【解决方案1】:

您希望返回两种情况中的最大值: (1) 包括第 n 个项目 (2) 项目不包括在内

试试这个...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2018-04-22
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多