动态规划中的背包变异

时间:2013-01-10 10:27:56

标签: algorithm optimization dynamic-programming

我正在尝试解决这个问题:我们给出了n个项目,其中每个项目都有给定的非负权重w1,w2,...,wn和值v1,v2,...,vn和背包最大权重W.我必须找到最大值的子集S,受两个限制:1)集合的总权重不应超过W; 2)我不能拿连续索引的对象。

例如,当n = 10时,可能的解是{1,4,6,9},{2,4,10} o {1,10}。

如何建立正确的重现?

1 个答案:

答案 0 :(得分:4)

回想一下,用于DP解决方案的背包递归公式是:

D(i,w) = max { D(i-1,w) , D(i-1,w-weight[i]) + value[i] }

在修改后的问题中,如果您选择i,则无法执行i-1,从而导致修改:

D(i,w) = max { D(i-1,w) , D(i-2,w-weight[i]) + value[i] }
                              ^
                          note here 
                       i-2 instead of i-1

与经典背包类似,它也是一次详尽的搜索 - 因此也出于同样的原因提供了最佳解决方案。
您的想法是,您决定选择i - 您无法选择i-1,因此请找到最多使用项目i-2的最佳解决方案。 (如果您决定排除i

,则不会更改原文