微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决反向 0/1 背包:表格中的这一行怎么可能?

我正在解决一个反向 0/1 背包问题,即我正在尝试仅使用 DP 表重新创建所有项目的权重和值列表。

我有这张桌子:

    [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 = 1 和 {{ 1}}(旧的)和 value = 4weight = 4-1 = value = 6-4weight = 3,这是新的。

问题:怎么可能有 [2][5] = 10?根据我的理解,我们不能在一行中放置超过 1 个项目。如果我们这里有两个项目在使用,那么行 [2] 中从 [2][4] 开始到行尾的所有元素不应该是 6 吗?

解决方法

如果您有两个项目,这似乎是可能的,一个权重为 1,值为 4,另一个为权重为 4,值为 6。

怎么样?当您处于索引 (2,4) 时,您在考虑项目 2(权重 4,值 6)的行中第一次拥有 4 的权重容量。这让您可以取值为 6 的项目,而不是您之前在索引 (2,3) 处取的权重为 1、值为 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]?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。