如何将数组划分为总和差最小的组?

时间:2016-07-24 23:53:09

标签: arrays sorting

我有整数数组,我需要在未知数量的组中对它们进行排序,每组的总和差别很小。

示例:

Array: 2, 1, 4, 7, 1, 2, 6, 8
Number of groups = 3
Result:
Group 1 – 8, 2 = 10
Group 2 – 7, 2, 1 = 10
Group 3 – 6, 4, 1 = 11

有没有alghoritham也能解决这个问题? 我被卡住了。

1 个答案:

答案 0 :(得分:0)

首先,如果组的数量是2,则这减少了子集和问题变量的分区问题。这证明问题是NP难的,所以你不应该试图找到一个有效的算法。

鉴于它至少是指数级的,你不妨只生成所有排列并选择最佳排列。我知道有些人不喜欢递归,但这对于列举群体的可能性非常有用:

recfunc(array, groups):
    if array is empty
        return an array containing the element groups
    else
        groupsList = empty array
        foreach aGroup in groups
            element = array[0]
            groupsList += recfun(array - element, groups where aGroup adds element)
       return groupsList

该算法将创建所有可能性的列表。效率相当低,但实施起来不应太难。从这里只需浏览列表并计算组的总和是否是列表的最小值。