我正在尝试解决有关spoj的问题。我创建了一个dp解决方案,但它给了我错误的答案。我正在创建dp矩阵并采用前一个答案的最大值并回答当前的好处。
任何人都可以解释问题的正确解决方案。 https://www.spoj.pl/problems/BACKPACK/
答案 0 :(得分:0)
我刚刚解决了这个问题。
我不知道你的“dp解决方案”究竟是什么,但显然这个问题在于背包类别(仍然是DP问题)。根据问题描述,它通常是0/1 knapsack problem。因此,下面的等式足以解决问题,其中opt[i]
表示总体积为i的背包可以达到的最大值。
opt[i] = max(opt[i], opt[i - items[j].vol] + items[j].value)
这个问题的特殊之处在于每个主要项目都可以附加0,1或2个项目。假设我们有一个主要项M
及其两个附件A1
和A2
。我们可以想象它们捆绑了4个项目,而不是单独考虑M, A1, A2
:
B1
,确实是M
本身。因此B1.volume = M.volume
和B1.value = M.volume * M.c
。B2
,由M
和A1
捆绑在一起。 B1.volume = M.volume + A1.volume
和B1.value = M.volume * M.c + A1.volume * A1.c
B3
与B2
类似,但将A1
替换为A2
。B4
由M, A1,
和A2
组成。 B4.volume = M.volume + A1.volume + A2.volume
和B4.value = M.volume * M.c + A1.volume * A1.c + A2.volume * A2.c
通过执行上述操作,我们可以将所有项目转换为捆绑包,我们可以使用这些捆绑包执行0/1背包。
最后但并非最不重要的是,请注意,对于由同一M
生成的捆绑包,只能选择B1, B2, B3,
和B4
中的一个。这可能需要一点点黑客,但不应该复杂。 :)