反向 0/1 背包:table 中的这一行怎么可能?

Reverse 0/1 knapsack: how is this row in the table possible?

我正在解决反向 0/1 背包问题,即我正在尝试仅使用 DP-table.

重新创建所有项目的重量和价值列表

我有这个table:

    [0][1]   [4][5][6]               [12]
[0]  0  0 0 0 0  0  0  0  0  0  0  0  0
[1]  0  4 4 4 4  4  4  4  4  4  4  4  4  
[2]  0  4 4 4 6 10 10 10 10 10 10 10 10

我不明白第 [2] 行怎么可能。

[0] - 很明显,如果我们不在背包里放任何东西,答案总值为0.

[1] - 在行 [1] 中,我看到 [1][1]=4,我希望我正确地得出第一个项目有 weight = 1value = 4 的结论。所以,因为我们只放了 1 件物品,所以它是我们希望在这一行中唯一的重量。

[2] - 当我们到达 [2][4] 时,我们有 6、6 > [2-1][4] 我假设我们在这里使用 2 个项目,一个 weight = 1value = 4(旧的)和weight = 4-1value = 6-4 = weight = 3value = 2,这是新的

问题: [2][5] = 10 怎么可能?根据我对这张图表的理解,我们不能连续放置超过 1 个项目。如果我们在这里使用了两个项目,我们不应该为第 [2] 行中从 [2][4] 到行末的所有元素设置 6 个吗?

如果您有两件物品,一件重量为 1,价值 4,另一件重量为 4,价值 6,这似乎是可能的。

怎么样?当您位于索引 (2, 4) 时,您在考虑项目 2 的行中第一次具有 4 的承重能力(重量 4,值 6)。这使您可以取值为 6 的项目而不是 的权重 1,您之前在索引 (2, 3) 处取的值为 4 的项目,有效地从索引 (2, 0) 处的子问题构建).

现在,当您位于索引 (2, 5) 且承重量为 5 时,总值为 10 是可能的,因为您可以同时拿走这两项。这是您可以为该行的其余部分做的最好的事情。


另见 How to find which elements are in the bag, using Knapsack Algorithm [and not only the bag's value]?