Python 以最有效的方式组合数字

Python 以最有效的方式组合数字,python,python-3.x,optimization,combinations,Python,Python 3.x,Optimization,Combinations,我正在研究一种将数据集与数字结合起来的方法,以使组合的总数最小化。约束条件是每个组合的总和必须小于某个数字 该问题的一个示例如下所示: 数据集:[11,10,19,2,12] 约束:组合之和=

我正在研究一种将数据集与数字结合起来的方法,以使组合的总数最小化。约束条件是每个组合的总和必须小于某个数字

该问题的一个示例如下所示:

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

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

您可以手动找到最佳组合为:[11,10],[19,2],[12]

目标:尽量减少组合的数量

然而,对于大型数据集,手工操作是不可能的

除其他外,我还研究了使用置换和线性方程组的可能性,但老实说,我真的不知道如何解决这个问题。有人能给我一些想法吗?提前感谢您。

您所需要的一切都是itertools.com


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

def分割最大项目数,最大总和: 结果=[] 部分=[] 对于项目中的项目: 如果sumpartial<最大和: 部分.appenditem 其他: result.appendpartial 部分=[项目] 如果部分: result.appendpartial 返回结果 分割最大值[11,10,19,2,12],21 [[11, 10], [19, 2], [12]]
请注意,如果允许项目以不同的顺序出现,则这不一定会产生最小数量的子列表。

问题中还有更多内容。到目前为止,您尝试了哪些代码?是否有其他限制?是什么使您提议的手动组合比例如[11,10]、[12,2]、[19]更好?订单应该保持不变吗?子列表中允许有2个以上的项目吗?完全通用的问题可以通过技术来解决,但它们的有效实现几乎是微不足道的。
>>> 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)]
>>>