一种变种背包问题的动态规划算法

时间:2011-10-07 07:01:25

标签: algorithm dynamic-programming knapsack-problem

我在想,

我想对背包问题做一个修改。

想象一下原始问题,具有各种权重/值的项目。

我的版本将与正常的权重/值一起包含“组”值。

例如。 第1项[5千克,600美元,电子] Item2 [1kg,50美元,食物]

现在,有了这样的一组项目,我将如何编码背包问题以确保每个“组”中最多选择1个项目。

注意:

  1. 您无需从该组中选择项目
  2. 每组中有多个项目
  3. 你仍然在减轻体重,最大化价值
  4. 预定义了组的数量及其值。
  5. 我只是在这个阶段编写代码草稿,我选择使用动态方法。我理解常规背包问题的动态解决方案背后的想法,如何更改此解决方案以合并这些“组”?

    KnapSackVariation(v,w,g,n,W)
    {
      for (w = 0 to W)
         V[0,w] = 0;
      for(i = 1 to n)
         for(w = 0 to W)
            if(w[i] <= w)
               V[i,w] = max{V[i-1, w], v[i] + V[i-1, w-w[i]]};
            else
               V[i,w] = V[i-1, w];
         return V[n,W];
    }
    

    这就是我到目前为止所需要的,需要添加它以便它会在每次解决此问题时从组中删除所有相应的项目。

2 个答案:

答案 0 :(得分:3)

刚刚注意到你的问题试图找到我自己的问题的答案。你所说的问题是一个众所周知且经过充分研究的问题,称为多选背包问题。如果你谷歌你会找到各种各样的信息,我也可以推荐这本书:http://www.amazon.co.uk/Knapsack-Problems-Hans-Kellerer/dp/3642073115/ref=sr_1_1?ie=UTF8&qid=1318767496&sr=8-1,它专门讨论了这个问题。在MCKP的经典公式中,您必须从每个组中选择一个项目。但是,通过向每个利润和权重= 0的组添加虚拟项目,您可以轻松地将该版本的问题转换为您的版本,并且相同的算法将起作用。我会提醒你不要试图通过一些调整来调整二进制背包问题的代码到MCKP - 这种方法很可能会引导你找到一个解决方案,当每个组中的项目数量增加时,其性能会降低得无法接受。

答案 1 :(得分:0)

假设
c [i]:第i个元素的类别
V [i,w,S]:背包的最大值,使其最多包含S中每个类别的一个项目

Recursive Formulation
V[i,w,S] = max(V[i-1,w,S],V[i,w-w[i],S-{c[i]}] + v[i])
Base Case
V[0,w,S] = -`infinity if w!=0 or S != {}`