带背包组合的背包算法

时间:2014-10-26 19:42:26

标签: algorithm knapsack-problem

我遇到了一个问题,我认为这是背包问题的一个变种。基本上我有一个大小为A的集合,我必须从中选择大小为n的组的最佳组合。组内项目的顺序无关紧要。同样,组的顺序也无关紧要。

因此,这两组人群将被视为等同:

{ a, b }, { a, c }
{ c, a }, { a, b }

例如,集合A = {a,a,b,b,c}和n = 2会给出这些组合:

{ a, a }, { b, b }
{ a, a }, { b, c }
{ a, b }, { a, b }
{ a, b }, { a, c }
{ a, c }, { b, b }

从这些组中我选择具有最佳价值的组。我一直在采取一些蛮力的方法解决这个问题,但我很快就遇到了性能问题。我的策略基本上包括以下步骤:

  1. 创建该集的所有排列。
  2. 对于每个排列,将该组拆分为大小为n的组。
  3. 删除所有“重复”的群组(即{a,b} = {b,a})
  4. 计算每组组的值,并选择具有最高值的组。
  5. 对于一组非常好的5或6个项目,排列的数量仍然非常易于管理。在那之后,事情变得无法控制,排列的数量是s!。

    我可以使用一些关于如何以更有效的方式解决这个问题的指示。

0 个答案:

没有答案