Algorithm 如果子问题[0/1背包]中没有重叠,DP有何帮助

Algorithm 如果子问题[0/1背包]中没有重叠,DP有何帮助,algorithm,recursion,dynamic-programming,memoization,knapsack-problem,Algorithm,Recursion,Dynamic Programming,Memoization,Knapsack Problem,考虑以下典型背包问题的输入 V = [10,8,12] W = [2,3,7] i = 1,2,3 C = 10 我尝试了递归和记忆来解决这个示例,但没有发现重叠的子问题 递归过程的签名: knapsack(int c, int i) 最初称为背包(10,1) 解决方法如和中所述 动态规划如何帮助降低此类背包样本的时间复杂度?如果动态规划无助于提高这种情况下的时间复杂度,那么DP解决方案的最坏情况复杂度是否也与基于回溯搜索的最坏情况复杂度相同,即2到n的幂[忽略剪枝,好像应用了剪枝,那

考虑以下典型背包问题的输入

V = [10,8,12]
W = [2,3,7]
i =  1,2,3
C = 10
我尝试了递归和记忆来解决这个示例,但没有发现重叠的子问题

递归过程的签名:

knapsack(int c, int i) 
最初称为背包(10,1)

解决方法如和中所述

动态规划如何帮助降低此类背包样本的时间复杂度?如果动态规划无助于提高这种情况下的时间复杂度,那么DP解决方案的最坏情况复杂度是否也与基于回溯搜索的最坏情况复杂度相同,即2到n的幂[忽略剪枝,好像应用了剪枝,那么解决方案的复杂性都会降低,而且DP不会比非记忆递归解决方案更好]

**在上面的示例中,子问题的重叠真的缺少了吗?或者我缺少了什么?***

DP对您的特定问题实例没有任何帮助。但一般来说,即,在所有可能的输入实例中,它解决的子问题永远不会比纯递归多,在许多实例中它解决的子问题要少得多。这就是为什么DP是好的


您的DP公式所保证的是,它可以通过最多解决
n(c+1)
子问题来解决问题的任何实例,事实上,对于您的示例,它是这样做的:这里
n
=3和
c
=10,它通过解决14来解决问题0/1背包问题有a。该解决方案的运行时间是O(nW)其中,
n
是可供选择的项目数,
W
是背包可承受的重量。运行时间被描述为多项式,因为
W
不是
n
的函数

或者是吗?给定一个
n
项目列表(按重量和价值),一个项目存在一个最大重量,称之为
k
(最大重量可以在O(n)时间内确定。)如果<代码> W 大于或等于<代码> KN<代码>,那么问题是微不足道的,所有的项都适合于背包中。因此,我们只需要考虑代码< W> KN的情况。因此,对于复杂度分析的目的,<>代码> W/COD>可以表示为<代码> N< /代码>。< /P>
假设
nW递归记忆解决方案的运行时间可以接近
2^n
,前提是没有一个权重与其他权重相加,并且容量足够大,足以包含总权重

动态规划的解决方案应该是
O(c*n)
,它是以容量而不是项目数为多项式的


在您的示例中,
n=3
c=10
,因此
2^n=8
c*n=30
。这里
c*n
大于
2^n
,因此dp解决方案没有帮助。如果您的项目数量更多,容量较小,则dp解决方案会更好。这些是dp解决方案的约束类型根据精确的公式,背包问题被认为是NP完全问题或NP难问题,因此需要找到一种没有指数运行时间的算法。DP是允许指数问题在多项式时间内求解的技术的通称。记忆是D中使用的一种技术P、 但这不是用于0/1背包问题的技术。@user3386109谢谢你的回答,我查看了wiki链接,我之前也看到过这个解决方案。但是正如我问题中提到的视频链接中教授们所说的那样,重复记忆只是解决问题的另一个角度,如果我们sh使用涉及表格的自底向上方法,或者我们使用带备忘录的递归。对于动态规划,重叠子问题是必须的,我在我的示例中找不到。如果您能帮助我为上面的示例定义它,那将对我有帮助。回答了要点。很好,这就是问题中提出的问题。