如何返回所有具有 N 总和的唯一数字组合 [重复]

Posted

技术标签:

【中文标题】如何返回所有具有 N 总和的唯一数字组合 [重复]【英文标题】:How to return all unique number combinations with the sum of N [duplicate] 【发布时间】:2017-11-09 12:28:00 【问题描述】:

我已经编辑了我的问题,因为我认为我没有很好地解释它。链接为副本的 subset_sum 函数似乎是当数字列表是随机的但在我的情况下也可以使用。但是,对于像下面我的函数这样的大量数字,它似乎效率低下。我的问题是基于 N 的值总是已知的数字列表。

如果 N 为 10,则数字列表将为 1 到 9 或 range(1, N)。该函数应该返回从 1 到 9 的所有唯一数字组合,总和为 10。在这种情况下,我下面的函数将解决这个问题并返回 9,但是对于大数字,它需要很长时间。在我看来,当数字范围已知时,应该有更好的方法来解决这个问题,而不是遍历每个可能的组合。也许我错了。

import itertools

def counter(n):
    count = 0
    l = range(1, n)
    for i in range(1, n):
        for c in itertools.combinations(l, i):
            if sum(c) == n:
                count += 1
    return count

【问题讨论】:

5+3+2 也是可能的,所以它会返回 9。 啊,谢谢!我认为该功能工作正常,但在我输入问题时无法想到最后一种可能性。那么我的问题实际上是关于如何在不必遍历每个可能的组合的情况下更有效地计算解决方案。 这是一个Subset sum problem,虽然在你的情况下是有序的,但它仍然是一个 NP 完全问题,所以你不能用一个简单的公式来解决它。一位 SO 成员不厌其烦地写出了解决问题的代码:***.com/a/4633515 计算一些,假设 n 在 range(10, 20) 中,然后将你的序列放入 oeis.org @zwer 看起来根本不像子集总和。 【参考方案1】:

你搜索的是分区函数 p。 查看https://en.m.wikipedia.org/wiki/Partition_(number_theory) 它包含递归公式,该公式仅在输入方面是线性的。

【讨论】:

以上是关于如何返回所有具有 N 总和的唯一数字组合 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

查找具有给定总和的数字列表的所有组合

39. 组合总和

39. 组合总和

216. 组合总和 III

216. 组合总和 III

#yyds干货盘点# LeetCode 热题 HOT 100:组合总和