我有整数数组,我需要在未知数量的组中对它们进行排序,每组的总和差别很小。
示例:
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也能解决这个问题? 我被卡住了。
答案 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
该算法将创建所有可能性的列表。效率相当低,但实施起来不应太难。从这里只需浏览列表并计算组的总和是否是列表的最小值。