【问题标题】:Subset sum with `itertools.combinations`带有“itertools.combinations”的子集和
【发布时间】:2014-01-29 01:36:43
【问题描述】:

我在 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 = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....]

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

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

我可以为需要的行李名称执行此操作。 我尝试以这种方式使用 itertools.combinations(根据建议):

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

我的目标:在满足子集总和等于 23 KG 的条件的每个子集的所有组合的 max_weight = 23 kg 的情况下,打印出我可以在旅行中携带的所有可能的行李名称子集。 用更简单的术语来说,我必须打印出一个包含行李名称的列表,如果它的重量相加将等于max_weight = 23 完全正确。 请记住:行李只能在每个子集中选择一次,但它们可以出现在尽可能多的子集中。此外,每个子集中的项目数是无关紧要的:它可以是 1 件行李、2、3 件……只要它们的总和正好等于 23。

【问题讨论】:

  • [c for i in range(len(luggages)+1) for c in combinations(luggages, i)] 为您提供所有可能的行李子集的扁平化列表。现在您可以使用 for 循环来遍历它们。在循环内部,您有另一个循环,它将当前子集的权重相加。如果总权重匹配,则再次遍历当前子集并输出名称。你真的不需要权重数组。
  • @NiklasB 我想我明白你的意思,这很有帮助!我唯一的问题是所有的 c for i ..... for c。我想我真的不明白它们是如何工作的?有什么办法可以向我解释吗?或者我可以参考的文档?谢谢
  • 这与两个嵌套的for 循环相同,它们产生一个值c,然后将其添加到列表的后面。请参阅我对您的其他问题的评论
  • @NiklasB。我现在了解嵌套的 for 循环,但最初的 c 本质上是在做什么/成为什么? [....] 括号真的需要吗?它们有什么作用?
  • 对不起,朋友,我为您提供了解释列表推导的 Python 文档的链接,它解释了一切。您也可以只查找在线教程或介绍性 Python 资源。您正在寻找的术语是“列表理解”。如果您想使用编程语言进行编程,您可能至少需要学习编程语言的基础知识;)

标签: python algorithm recursion


【解决方案1】:

为旅行推销员工作,是吗?您可以使用每个人都喜欢的 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)

【讨论】:

  • 啊原来如此 :) 我撤回我的评论!我想我们的答案在某些方面几乎相同:)
  • 我稍微清理了代码并修复了一个错误,希望您不要介意。 OP 也想打印名字,而不是权重,但是我们不需要为他/她做所有的工作
  • 一点也不!很好的收获:)
  • @NiklasB。您能否解释一下 i for i 的本质含义和作用?
  • @user3245453:这不是我的答案,而是list comprehension。类似的构造是generator expression,也用于此答案。基本上他们试图将集合推导的数学符号引入编程语言,集合{ 2i | i ∈ R, i > 3} 变为[2*i for i in R if i > 3]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多