我正在寻找一种将数据集与数字组合的方法,以使组合的总数最小化。约束是每个组合的总和必须小于一定数量。
问题的一个示例可能看起来像这样:
数据集:
[11, 10, 19, 2, 12]
约束:组合
=< 21
的总和,每个数字只能使用一次。手动找到最佳组合是:
[11, 10], [19, 2], [12]
目标:最小化组合数量
但是,对于大型数据集,无法手动完成。
我已经研究了方程的使用,排列和线性系统的可能性,但是老实说,我真的不知道如何解决问题。有人可以给我一些想法吗?预先谢谢你。
答案 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)]
>>>