小编典典

如何使用背包算法[不仅仅是袋子的价值]查找袋子中的哪些元素?

algorithm

我有一个代码,该代码通过背包算法(bin打包NP-hard问题)计算出最佳值:

int Knapsack::knapsack(std::vector<Item>& items, int W)
{
    size_t n = items.size();
    std::vector<std::vector<int> > dp(W + 1, std::vector<int>(n + 1, 0));
    for (size_t j = 1; j <= n; j++)
    {
        for ( int w = 1; w <= W; w++)
        {
            if (items[j-1].getWeight() <= w)
            {
                dp[w][j] = std::max(dp[w][j-1], dp[w - items[j-1].getWeight()][j-1] + items[j-1].getWeight());
            }
            else
            {
                dp[w][j] = dp[w][j - 1];
            }
        }
    }
    return dp[W][n];
}

我还需要显示包装中包含的元素。我想创建一个数组,在其中添加一个元素。因此,问题在于添加该附加元素的步骤是什么,或者还有其他更有效的方法吗?

问题: 我希望能够知道为我提供最佳解决方案的项目,而不仅仅是最佳解决方案的价值。

PS。对不起,我的英语不是我的母语。


阅读 275

收藏
2020-07-28

共1个答案

小编典典

从矩阵中获取要打包的元素可以使用矩阵中的数据完成,而无需存储任何其他数据。
伪代码:

line <- W
i <- n
while (i> 0):
  if dp[line][i] - dp[line - weight(i)][i-1] == value(i):
      the element 'i' is in the knapsack
      i <- i-1 //only in 0-1 knapsack
      line <- line - weight(i)
  else: 
      i <- i-1

其背后的想法是 :迭代矩阵,如果权重差恰好是元素的大小,则在背包中。
如果不是,则说明该项目不在背包中,请继续使用它。

2020-07-28