在一定条件下为N组分配数字列表的算法

时间:2009-02-27 16:23:48

标签: algorithm

假设我有一个数字列表:

2,2,3,4,4

将数字拆分为N组(此处以3组为例):

A:2,3 sum:5

B:4   sum:4

C:2,4 sum:6

我想要的是最小化具有最高总和的组(这里是6) - 具有最小总和的组(这里是4)。

有人想到一种算法来实现这个目标吗?


另一个例子:

7,7,8,8,8,9,9,10

结果应如下:

A:7,8,8 sum:23

B:7,8,9 sum:24

C:9,10  sum:19

3 个答案:

答案 0 :(得分:5)

不幸的是,这个问题很难实现。请参阅multiprocessor schedulingbin packing的参考资料。如果您对该方法感兴趣,您也可以找到一些有用的近似算法。

答案 1 :(得分:1)

考虑到即使N是2,问题是NP完成,我可以给你一个非常糟糕的算法。

http://mathworld.wolfram.com/NumberPartitioningProblem.html

答案 2 :(得分:0)

Zweiterlinde关于结帐bin packing的建议是要走的路。

我继续发布这个,在我输入它之后意识到这是错误的。

你想要一种贪婪的方法,首先使用最大的数字。

  1. 对列表进行排序以实现订购
  2. 开始将最大的数字放入组中 - 尽可能多地达到第一个数字
  3. 达到最大组数时停止
  4. 按总和对组进行排序,然后将最大数字添加到最小的组中,重复直至完成。
  5. 这应该让你: 来自2,2,3,4,4 ...

    group 1 (4): 4
    group 2 (6): 4, 2
    group 3 (5): 3, 2
    

    和7,7,8,8,8,9,9,10 ......

    group 1 (18): 10, 8
    group 2 (24): 9, 8, 7
    group 3 (24): 9, 8, 7
    

    虽然我猜第二个例子可能是19,24,23,这使得这个错了。哼。