【发布时间】:2016-12-25 20:53:51
【问题描述】:
考虑以下典型背包问题的输入。
V = [10,8,12]
W = [2,3,7]
i = 1,2,3
C = 10
我尝试使用记忆递归来解决这个示例,但没有发现重叠子问题。
递归过程的签名:
knapsack(int c, int i)
最初称为knapsack(10,1)
解决方法如https://www.youtube.com/watch?v=6h6Fi6AQiRM和https://www.youtube.com/watch?v=ocZMDMZwhCY中所述。
动态规划如何帮助降低此类背包样本的时间复杂度?基于回溯搜索,即 2 的 n 次幂 [忽略修剪,如果应用了修剪,那么解决方案的复杂性将会降低,并且 DP 不会比非记忆递归解决方案更好]
** 上面的示例中是否确实缺少子问题的重叠,或者我遗漏了什么?**
【问题讨论】:
-
已知背包问题是 NP 完全问题或 NP 困难问题,具体取决于确切的公式,因此找到一个没有指数运行时间的算法将是 very surprising indeed。
-
DP 是允许在多项式时间内解决指数问题的技术的通用术语。记忆是 DP 中使用的一种技术,但不是用于 0/1 背包问题的技术。
-
@user3386109 感谢您的回答,我查看了 wiki 链接,我之前也看过这个解决方案。但正如我的问题中提到的视频链接中的教授所说,recurrence with memoization 只是解决问题的另一种观点,如果我们希望使用涉及表格的自下而上的方法,或者我们使用带有 memo 的recurrence,这并不重要。跨度>
-
用于动态编程 重叠子问题是必须具备的,但我无法在我的示例中找到。如果您能帮我为上述示例定义它,那将对我有所帮助。
标签: algorithm recursion dynamic-programming memoization knapsack-problem