我有一组数字,例如。 [100,90,80,70,60,50]
并希望查找大小为r=3
的所有组合,但要求减少总和。
按降序排列数字不起作用,例如。
(100, 90, 80) 270
(100, 90, 70) 260
(100, 90, 60) 250
(100, 90, 50) **240**
(100, 80, 70) **250**
(100, 80, 60) 240
我怎样才能找到减少总和值的组合集。
答案 0 :(得分:0)
这里是“守则”
import itertools
array = [100,90,80,70,60,50]
size = 3
answer = [] # to store all combination
order = [] # to store order according to sum
number = 0 # index of combination
for comb in itertools.combinations(array,size):
answer.append(comb)
order.append([sum(comb),number]) # Storing sum and index
number += 1
order.sort(reverse=True) # sorting in decreasing order
for key in order:
print key[0],answer[key[1]] # key[0] is sum of combination
上述代码的输出为
270 (100, 90, 80)
260 (100, 90, 70)
250 (100, 80, 70)
250 (100, 90, 60)
240 (90, 80, 70)
240 (100, 80, 60)
240 (100, 90, 50)
230 (90, 80, 60)
230 (100, 70, 60)
230 (100, 80, 50)
220 (90, 70, 60)
220 (90, 80, 50)
220 (100, 70, 50)
210 (80, 70, 60)
210 (90, 70, 50)
210 (100, 60, 50)
200 (80, 70, 50)
200 (90, 60, 50)
190 (80, 60, 50)
180 (70, 60, 50)
答案 1 :(得分:-1)
第一个(和天真的)解决方案是迭代所有可能的排列,并将这些集保存在最小堆中。最后,只需逐个删除所有套件 运行时间:假设x = n选择r,所以O(xlogx)
第二个稍微复杂一点:
*你需要保存你发现的最小数量,直到现在为止
*现在你通过一次更改完全像你的例子那样迭代,要知道你要移动到的下一个集合是什么,你必须用数组中的下一个数字替换当前集合中的每个数字,并替换less的max选项比你节省的最低限度。当然,将最小值设置为新的最小值
运行时间:O((n选择r)* r)