algorithm - 反向 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 = 1
和的结论value = 4
。所以,因为我们只放了 1 件物品,所以它是我们希望在这一行中唯一的重量。
[2] - 当我们到达 [2][4] 时,我们有 6, 6 > [2-1][4] 我假设我们在这里使用 2 个项目,一个weight = 1
和value = 4
(旧的)和weight = 4-1
和value = 6-4
= weight = 3
和value = 2
,这是新的。
问题:怎么可能有 [2][5] = 10?据我了解,我们不能在一行中放置超过 1 个项目。如果我们在这里使用了两个项目,那么从 [2][4] 到行尾的第 [2] 行中的所有元素不应该有 6 个吗?
解决方案
如果您有两件物品,一件重量为 1 且值为 4,一件重量为 4 且值为 6,这似乎是可能的。
如何?当您处于索引 (2, 4) 时,您在考虑项目 2 的行中的重量容量首次为 4(重量 4,值 6)。这使您可以获取值为 6 的项目,而不是之前在索引 (2, 3) 获取的权重为 1、值 4 的项目,有效地从索引 (2, 0) 处的子问题构建。
现在,当您处于索引 (2, 5) 的重量为 5 时,总价值可能为 10,因为您可以同时携带这两项。这是你可以为该行的其余部分做的最好的事情。
推荐阅读
- html - CSS 帮助 : 使内容块扩展到几乎整页
- python - 当程序在 Python 中完成时,如何使函数运行?
- reactjs - 2个子组件无限重新渲染
- mysql - 对如何连接到 MySQL 数据库感到困惑
- assembly - 是否指定了在 x64 上推送堆栈指针时会发生什么?
- directory - 在 Julia 中为每次运行创建新目录
- python - 为什么我的 TCP 连接在 netcat (nc) 和 telnet 中正常工作时不提供对消息的响应?
- javascript - 如何自定义使用 createObjectURL 创建的 URL,
- powershell - 在 Powershell 中过滤具有多个条件的 Foreach-Object 结果不起作用
- php - 显示角色名称 (ID) 和显示角色名称