当前位置: 首页 > 知识库问答 >
问题:

从一个数字列表中找出所有不同和的算法

鲁永福
2023-03-14

示例输入:

4 6 4 3 2 2 1 1

第二个数=数的个数,S(S<=12)

S numbers=这些数字的值(每个值<100)。(重复可能发生,输入按非递增顺序给出)

我的工作是使用列表中加起来等于T的数字来找到所有“不同的和”。

4
3+1
2+2
2+1+1

等等。

  1. 我不确定这个算法是否有效
  2. 我在实现该算法方面遇到了困难。我不能把我的头缠在如何循环结构以便得到想要的组合上。

共有1个答案

董和泽
2023-03-14

您应该尝试一个递归解决方案。主要是,你只需要考虑到,对于每一个数字,你可以把它包括在你的总和中,也可以不包括。这意味着您正在构建数字的幂集,并将得到O(2^n)解决方案。

简单地用伪代码表示:

def get_all_sums(arr, target):

    result = []

    def helper(index, current_arr, current_sum):

        # once you've gone over the arr you can return. If all your numbers are positive
        # you can also return early if the current_sum > target
        if index == len(arr): return

        # solution found - add it to the result
        if current_sum == target: result.append(current_arr)

        # include the current index
        helper(index + 1, current_arr + [arr[index]], current_sum + arr[index])

        # don't include the current index
        helper(index + 1, current_arr, current_sum)

    helper(0, [], 0)

    # sort and hash to get rid of duplicates; return a set
    return {tuple(sorted(i) for i in result)}
 类似资料:
  • 使用椭圆曲线分解(在Python中),我能够在~0.5秒内找到50位数字的PRIME因子。有什么方法可以将质因数转换为数字的因子吗? 通过对小数位(496和28)进行测试,将质因数按特定顺序相乘,我实现了什么。然后,将这些数字相乘,几乎就能得到因数,但这并不太灵活,因为我只从一个小的质因数列表(1,2,3,5)中得到需要相乘的公式。

  • 问题内容: 假设我有两个列表,l1和l2。我要执行l1 - l2,返回l1not中的所有元素l2。 我可以想到一个幼稚的循环方法来执行此操作,但这实际上效率很低。什么是Python高效的方法? 例如,如果我有,应返回 问题答案: Python具有称为List Comprehensions的语言功能,非常适合使这种事情变得非常容易。以下语句完全满足你的要求,并将结果存储在l3: l3将包含。

  • 问题内容: 我有一本这样的字典: 基本上是一本具有嵌套列表,字典和字符串的字典,其深度是任意的。 遍历此方法以提取每个“ id”键的值的最佳方法是什么?我想实现与“ // id”之类的XPath查询等效的功能。“ id”的值始终是一个字符串。 因此,从我的示例中,我需要的输出基本上是: 顺序并不重要。 问题答案: 我发现此Q / A非常有趣,因为它为同一问题提供了几种不同的解决方案。我采用了所有这

  • 问题内容: 给定一个数组,我们需要找到总和等于数字 X 的所有对。 例如: 问题答案: 解决方案1: 您可以检查每一对数字,并找到总和等于 X。 Java 代码: 解决方案2: 对数组进行排序 * 我们将维护两个索引,一个在开头(l=0),一个在结尾(r=n-1) * 迭代直到 l < r * 检查 arr[l] + arr[r] 是否等于 X * 如果是,则打印该对并执行 l , r– * 如果

  • 我有一个列表,例如:1,2,5,6,8,12,15 我正在尝试创建一个SQL查询,该查询将从上一个列表中返回一个数字列表,而不存在于另一个列表中。 那么,假设我从一个表中获取所有id,它们是:1,3,7,8,15 结果集应为:2,5,6,12 因为这些数字没有出现在第二个列表中,而是出现在第一个列表中。 我原以为这会很容易,但我被难住了。谷歌搜索它并没有得到我可以使用的结果,只是列出了有关列表和左