如何将数组分成具有最合适总和的两组

时间:2018-03-22 18:06:33

标签: algorithm data-structures

您将获得一个整数数组。您可以将此数组划分为两个不同的组,并且该组必须具有最大的总和(两个组的总和之间的差异需要在模数中尽可能低)。输出需要包含两组中每一组的总和。例如:如果n = 5且数组为{2,8,10,1,3},则输出需要为12和12(12 = 2 + 10和12 = 8 + 1 + 3)。有没有比回溯更快的解决方案?

1 个答案:

答案 0 :(得分:0)

您所描述的内容称为Partition Problem(优化版本),这是NP难的,因此您无法找到始终为您提供精确结果的高效算法。但是,有一些近似的解决方案在实践中非常有效。

一个例子是greedy algorithm,它对输入数组进行排序,然后从最大值开始填充两个输出数组,如下所示:

(1) Put first value to out1
(2) fill up out2 until sum(out2) > sum(out1), exit if no more items
(3) fill up out1 until sum(out1) > sum(out2), exit if no more items
(4) resume with (2)