【发布时间】:2020-06-12 12:39:33
【问题描述】:
如何在 Python 中有效地找到 n 正整数的所有可能组合加上给定数字 k?
我知道我可以通过过滤所有可能的组合来解决这个问题:
import itertools
def to_sum_k(n, k):
for i in itertools.product(range(1, k - n + 2), repeat=n):
if sum(i) == k:
yield i
print(list(to_sum_k(3, 5)))
# [(1, 1, 3), (1, 2, 2), (1, 3, 1), (2, 1, 2), (2, 2, 1), (3, 1, 1)]
我看到有人以抽象的方式讨论过类似的事情here,但我没有看到将其转换为代码的简单方法。
另外,我更喜欢迭代解决方案而不是递归解决方案。
【问题讨论】:
-
您期待什么样的答案?你的代码有什么问题?
-
您可以通过仅找到 n-1 个数字的组合来使该代码更高效 - 然后计算最终数字必须是多少才能达到所需的总数(拒绝该数字为非正数的任何组合)。
-
动态编程是要走的路。
-
@NicolasGervais 这完全没有效率。所有生成的元组中只有一小部分满足条件,并且随着输入的增加,情况会变得更糟。
list(to_sum_k(4, 100))需要约 15 秒才能生成约 150k 条目,在约 90m 中可见。 -
@NicolasGervais 除了你的解决方案缺少很多结果,而我的没有。
标签: python algorithm combinatorics