algorithm - 背包 0-1 动态规划解决方案背后的直觉?
问题描述
作为课程的一部分,我一直在学习动态编程,并且几天来一直在努力解决背包 0-1 问题的 DP 解决方案。我对问题和解决方案的理解是这样的:
我们有 items (A, B, C, D)
,一个W = 10
最大重量的背包,每个项目的重量/值是A = 2w/1v, 2w/3v, 5w/8v, 6w,5v
。
该解决方案要求我们查看将背包重量限制在 0 -> W 以及从 A -> D 限制项目的子问题。
我不明白的是
- 如何直观地得出这个解决方案?
- 既然我们需要遍历每个项目,为什么即使项目的顺序不同,解决方案也能工作?
- 如果一个人在没有 DP 的情况下这样做并使用蛮力尝试所有组合方法,那么 DP 子问题解决方案如何解释所有可能的背包解决方案组合?
解决方案
不确定您所说的“直观”是什么意思,但我们可以了解如何形成递归关系并将其应用于问题参数。
该解决方案无论顺序如何都有效,因为每个子问题都与当前项目和我们已经访问过的子问题相关。重复确实考虑了“所有组合”;这就是为什么如果我们访问 A -> B,当我们到达 C 时,我们实际上是在尝试 AB AB C AC BC 和 ABC;如果我们宁愿访问 A -> C,那么 B;考虑到加法是关联的(AC AC B BA BC BAC),我们会得到相同的整体可能性。(我们实际上并没有访问所有组合,请参见 3。)
我们通过访问 W*N 的整个搜索空间来考虑所有可能性。由于我们受 W 约束,所有权重总和组合将落在或低于它,DP 所做的是记录每个可实现权重的最佳可见值。当我们到达
i
第一项,我们不需要知道创建所有总和的项的具体组合(我们可能想追溯实际项,但这不需要详尽的记录)。对于我们迭代的每个权重(我们每次访问一个项目时迭代所有可能的权重),我们只需要知道(1)在相同权重下看到的最佳值(所以不使用这个项目),以及(2)在比这个项目的重量更低的重量下看到的最佳值(如果我们正在使用这个项目,那么我们希望将它的值添加到在该较低重量下看到的最佳值,这样两个重量一起代表我们在重量中的当前重量迭代)。我们为 处的值选择 (1) 和 (2) 中的最佳值dp[i][w]
。
推荐阅读
- java - Spring Cloud Config 的大小限制是多少?
- angular - 如何将数据传递给 ng-bootstrap 模态对话框
- java - 应用程序启动失败:Spring Boot setEnableLoggingRequestDetails() 不存在
- matlab - 在 matlab 中创建具有自定义限制和平滑颜色过渡的自定义颜色图
- javascript - 许多相同的输入-> 一个请求的表单/多个请求的多个表单?
- java - 为中断分组线程
- corda - Corda 作为传输层:读取数据
- python - 在 Python 中不导入(即剪贴板、Pyperclip)复制到操作系统剪贴板
- hive - 如何加载“|” 分隔文件到配置单元中,而不使用“行格式分隔符”创建配置单元表
- angular-cli - 未找到模块:错误:无法解析“C:\Users\JJ\Documents\JHipster Projects\indigo\node_modules\fs.realpath”中的“fs”