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

Posted

技术标签:

【中文标题】动态规划:0/1 背包 - 将组合检索为数组【英文标题】:Dynamic Programming: 0/1 Knapsack - Retrieving Combinations as array 【发布时间】: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] = maxknapsack_memoized(i-1,w), values[i]+knapsack_memoized(i-1, w-weights[i])

    return memo_pad[i][w]
end

我不知道如何找出输入项的哪种组合会给我返回的优化值?

【问题讨论】:

您忘记了索引结束的基本情况。 【参考方案1】:

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

试试这个...

else:
    memo_pad[i][w] = maxvalues[i] + memo_pad[i-1][w-weights[i]], 
    memo_pad[i-1][w]

【讨论】:

以上是关于动态规划:0/1 背包 - 将组合检索为数组的主要内容,如果未能解决你的问题,请参考以下文章

用动态规算法求出的0-1背包问题,写出完整的可以运行的程序,并且给出算法复杂性的分析与结果,谢谢

动态规划(0-1背包)--- 组合总和

动态规划-背包问题

动态规划-背包问题

动态规划-背包问题

0-1背包(动态规划)