algorithm - 打印背包中袋子里的元素

标签 algorithm dynamic-programming knapsack-problem

假设你是一个小偷,你闯入了一所房子。您在里面找到了以下元素:

一个重3磅、值(value)50美元的花瓶。
一 block 重 6 磅、值(value) 30 美元的银 block 。
一幅重4磅、值(value)40美元的画。
一面重 5 磅、值(value) 10 美元的镜子。

这个 10 磅背包问题的解是 90 美元。

由动态规划制成的表是:-

enter image description here

现在我想知道我使用这张表将哪些元素放入我的麻袋中然后如何回溯??

最佳答案

从您的 DP 表中我们知道 f[i][w] = 总重量小于或等于 w 的项目 1..i 的子集的最大总值(value)。

我们可以使用表本身来恢复最佳打包:

def reconstruct(i, w):  # reconstruct subset of items 1..i with weight <= w
                        # and value f[i][w]
  if i == 0: 
      # base case
      return {}
  if f[i][w] > f[i-1][w]:
      # we have to take item i
      return {i} UNION reconstruct(i-1, w - weight_of_item(i))
  else:
      # we don't need item i
      return reconstruct(i-1, w)

关于algorithm - 打印背包中袋子里的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23186171/

相关文章:

dynamic-programming - 找出最小匹配对

ruby - 有效地抓取一些符合条件的子集

algorithm - 为什么霍夫曼编码的文本比实际文本大?

algorithm - 如何使用动态规划接近路由路径

python - 偶数异或子数组的数量

python - 跟踪动态规划步骤

algorithm - 将列表复制到 HashSet 的算法的空间复杂度

java - 它如何确保一个节点是祖先节点而不是兄弟节点?

algorithm - 具有最大权重的单词分区

c++ - 背包问题 - 找出哪些元素被拿走了