我正在尝试解决这个问题:我们给出了n个项目,其中每个项目都有给定的非负权重w1,w2,...,wn和值v1,v2,...,vn和背包最大权重W.我必须找到最大值的子集S,受两个限制:1)集合的总权重不应超过W; 2)我不能拿连续索引的对象。
例如,当n = 10时,可能的解是{1,4,6,9},{2,4,10} o {1,10}。
如何建立正确的重现?
答案 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
)