带各种物品的背包

时间:2017-06-30 06:13:31

标签: algorithm knapsack-problem

假设一个常规的背包问题:你有一个权重约束,CValueWeight (V, W)的项目数。您希望最大化VW位于C之下。在这个问题中,每个项目只能有一个。

但这个问题还有一个问题。你想拥有各种各样的物品。假设问题表明您希望拥有至少5个(或任意数量)的不同项目。如果解决方案包含少于5个不同的项目,则答案无效。有没有解决这个问题的方法?

1 个答案:

答案 0 :(得分:0)

这只是另一种形式的约束,所以让我们看看权重(最多C权重)和多样性(至少5个不同项目)的差异:

  • 重量从有效开始(空袋低于C),而Diversity开始无效(空袋不包含5个不同的物品)。

首先要注意的是,使用附加约束需要无效/无法解决的概念,因为如果没有5个不同的项满足权重约束,则没有解决方案。

一旦定义了返回某些invalid结果的方法,它就非常接近标准的背包问题。在递归中,只需传递剩余允许的权重和当前多样性。在递归锚点情况下,检查Diversity并返回invalid如果Diversity不符合要求,否则返回结果,就像在正常的背包问题中一样。检查invalid的递归结果并对其进行相应处理。