Spoj背包DP说明

时间:2014-06-21 05:01:26

标签: matrix

我正在尝试解决有关spoj的问题。我创建了一个dp解决方案,但它给了我错误的答案。我正在创建dp矩阵并采用前一个答案的最大值并回答当前的好处。

任何人都可以解释问题的正确解决方案。 https://www.spoj.pl/problems/BACKPACK/

1 个答案:

答案 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及其两个附件A1A2。我们可以想象它们捆绑了4个项目,而不是单独考虑M, A1, A2

  • B1,确实是M本身。因此B1.volume = M.volumeB1.value = M.volume * M.c
  • B2,由MA1捆绑在一起。 B1.volume = M.volume + A1.volumeB1.value = M.volume * M.c + A1.volume * A1.c
  • B3B2类似,但将A1替换为A2
  • B4M, A1,A2组成。 B4.volume = M.volume + A1.volume + A2.volumeB4.value = M.volume * M.c + A1.volume * A1.c + A2.volume * A2.c

通过执行上述操作,我们可以将所有项目转换为捆绑包,我们可以使用这些捆绑包执行0/1背包。

最后但并非最不重要的是,请注意,对于由同一M生成的捆绑包,只能选择B1, B2, B3,B4中的一个。这可能需要一点点黑客,但不应该复杂。 :)