以最有效的方式组合数字

时间:2019-07-18 08:31:16

标签: python python-3.x optimization combinations

我正在寻找一种将数据集与数字组合的方法,以使组合的总数最小化。约束是每个组合的总和必须小于一定数量。

问题的一个示例可能看起来像这样:

  

数据集[11, 10, 19, 2, 12]

     

约束:组合=< 21的总和,每个数字只能使用一次。

     

手动找到最佳组合是:[11, 10], [19, 2], [12]

     

目标:最小化组合数量

但是,对于大型数据集,无法手动完成。

我已经研究了方程的使用,排列和线性系统的可能性,但是老实说,我真的不知道如何解决问题。有人可以给我一些想法吗?预先谢谢你。

2 个答案:

答案 0 :(得分:1)

在没有进一步说明的情况下,以下算法会产生预期的输出:

def split_max(items, max_sum):
    result = []
    partial = []
    for item in items:
        if sum(partial) < max_sum:
            partial.append(item)
        else:
            result.append(partial)
            partial = [item]
    if partial:
        result.append(partial)
    return result


split_max([11, 10, 19, 2, 12], 21)
# [[11, 10], [19, 2], [12]]

(请注意,如果允许项目以不同的顺序出现,这不一定会产生最小数量的子列表。)

答案 1 :(得分:0)

itertools.combinations

>>> from itertools import combinations
>>> myList = [11,10,19,2,12]
>>> [i for i in combinations(myList, 2) if sum(i) <= 21] # first will be your iterable, second is the position here you need combination for 2 position
[(11, 10), (11, 2), (10, 2), (19, 2), (2, 12)]
>>>