【问题标题】:Selecting a set of numbers from a list which add up to a given value [closed]从列表中选择一组数字,加起来为给定值[关闭]
【发布时间】:2014-11-22 23:37:08
【问题描述】:

如何从给定列表中选择一些数字,以使它们的总和为某个给定数字?

例子:

wanted_num = 10
my_list = [1, 3, 11, 123, 5, 4]

=> [1, 5, 4]

【问题讨论】:

  • 请澄清:你想找到2个总和为所需数字的数字,还是求和的最小尺寸集?如果有多个集合的总和为所需数量会怎样?
  • 可能是多个数字组成总和。在这种情况下,它只有 2

标签: python list combinations


【解决方案1】:

这是一种可能的方法:

def find_combinations(list, sum):
    if not list:
        if sum == 0:
            return [[]]
        return []
    return find_combinations(list[1:], sum) + \
        [[list[0]] + tail for tail in
         find_combinations(list[1:], sum - list[0])]

对于您的示例,这将返回:

>>> print find_combinations([1, 3, 11, 123, 5, 4], 10)
[[1, 5, 4]]

【讨论】:

    【解决方案2】:

    这是一个更通用的版本,它检查的不只是对(基本上,任何加起来达到所需目标的 n 元组)

    def findSum(target, L, sofar=None):
        if sofar is None:
            sofar = []
        if not target:
            print(sofar)
            return
        if target < 0:
            return
        for i,num in enumerate(L):
            findSum(target-num, L[:i]+L[i+1:], sofar+[num])
    

    输出:

    In [34]: findSum(10, [1,3,11,123,5,7])
    [3, 7]
    [7, 3]
    

    请注意,它不排除相似的集合

    【讨论】:

      【解决方案3】:

      下面的解决方案应该有效:

      wanted_num = 10
      my_list = [1, 3, 11, 123, 5, 7]
      for i in range(0, len(my_list)):
          for j in range(0, len(my_list)):
              if i + j == wanted_num:
                  answer = [i, j]
                  break
      
      print(answer)
      

      此解决方案假设只有两个数字加起来为wanted_num。 希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        相关资源
        最近更新 更多