use*_*453 4 python algorithm recursion
我在python中有一个整数列表,可以这样说:
weight = [7, 5, 3, 2, 9, 1]
Run Code Online (Sandbox Code Playgroud)
我应该如何使用itertools.combinations查找这些整数存在的所有可能的总和子集。这样我就得到了(带有3个整数的所需输出的示例-weight = [7,5,3]:
sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ]
Run Code Online (Sandbox Code Playgroud)
与这些重量相关联,我还有另一个名为“行李箱”的数组,它是一个列表的列表,其中包含行李箱名称及其对应重量的格式:
luggages = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....]
Run Code Online (Sandbox Code Playgroud)
我以这种方式创建了一个称为权重的数组。
weight = numpy.array([c[1] for c in luggages])
Run Code Online (Sandbox Code Playgroud)
我可以这样做,因为需要行李名。我试图以这种方式使用itertools.combinations(根据建议):
comb = [combinations(weight, i) for i in range(len(luggages))]
Run Code Online (Sandbox Code Playgroud)
我的目标:鉴于max_weight = 23
满足每个子集总和等于23 KG的条件的每个子集的所有组合的千克,打印出我可以带去旅行的所有可能的行李名子集。用简单的话来说,我必须打印出一张清单,上面列出行李的名称,如果将它们的重量相加,它们将max_weight = 23
完全相同。注意:行李在每个子集中只能选择一次,但它们可以出现在尽可能多的子集中。同样,每个子集中的项目数量无关紧要:可以是1个行李箱,2、3 ...,只要它们的总和等于23。
在旅行推销员上工作,是吗?您可以使用每个人最喜欢的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)
Run Code Online (Sandbox Code Playgroud)