与`itertools.combinations`的子集和

时间:2014-01-29 01:36:43

标签: python algorithm recursion

我在python中有一个整数列表,让我们说:

weight = [7, 5, 3, 2, 9, 1]

我应该如何使用itertools.combinations查找具有这些整数的所有可能的和子集。 所以我得到了(3个整数所需输出的例子 - weight = [7,5,3]:

sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ]

与这些权重相关联我还有另一个名为luggages的数组,它是一个包含行李名称及其对应权重的列表列表:

luggages = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....]

我以这种方式创建了一个名为weight的数组。

weight = numpy.array([c[1] for c in luggages]) 

我可以为行李名称做到这一点。 我试图以这种方式使用itertools.combinbin(根据建议):

comb = [combinations(weight, i) for i in range(len(luggages))]

我的目标:打印出我可以携带的行李名称的所有可能子集,给定max_weight = 23 kg每个子集的所有组合,满足子集总和等于23 KG的条件。 简单来说,我必须打印出一个带有行李名称的列表,如果它的权重加总,则会完全等于max_weight = 23。 请记住:行李只能在每个子集中选择一次,但它们可以出现在尽可能多的子集中。此外,每个子集中的项目数量是无关紧要的:它可以是1个行李,2,3个......只要它们的总和恰好等于23个。

1 个答案:

答案 0 :(得分:4)

对旅行推销员工作,是吗?你可以使用每个人最喜欢的Python功能,列表推导来实现这一点:

weight = [7, 5, 3, 2, 9, 1]

cmb = []
for x in range(1, len(weight) + 1):
    cmb += itertools.combinations(weight, x)

#cmb now contains all combos, filter out ones over the limit

limit = 23

valid_combos = [i for i in cmb if sum(i) == limit]

print(valid_combos)