我在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个。
答案 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)