【问题标题】:Finding all possible permutations of a fixed length of numbers to reach a given sum查找固定长度数字的所有可能排列以达到给定总和
【发布时间】:2019-12-17 12:21:52
【问题描述】:

我想从Finding all possible combinations of numbers to reach a given sum 修改subset_sum() python 函数,以便:

  1. 它允许重复(排列)而不是组合
  2. 它只考虑给定长度的排列

我已成功完成 #2,但我需要 #1 方面的帮助:

def subset_sum(numbers, target, length, partial=[]):
    s = sum(partial)

    # check if the partial sum is equals to target
    if s == target and len(partial) == length:
        print(f"sum({partial})={target}")
    if s >= target:
        return  # if we reach the number why bother to continue

    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i+1:]
        subset_sum(remaining, target, length, partial + [n]) 

期望的输出应该是:

>>> subset_sum([3,9,8,4,5,7,10],target=15,length=3)
sum([3, 8, 4])=15
sum([3, 4, 8])=15
sum([4, 3, 8])=15
sum([4, 8, 3])=15
sum([8, 3, 4])=15
sum([8, 4, 3])=15
sum([3, 5, 7])=15
sum([3, 7, 5])=15
sum([5, 3, 7])=15
sum([5, 7, 3])=15
sum([7, 3, 5])=15
sum([7, 5, 3])=15

【问题讨论】:

    标签: python algorithm permutation


    【解决方案1】:

    既然您已经解决了在每个等价组中识别一个 解决方案的问题,我的建议是:不要 更改该算法。相反,利用itertools.permutations 来生成这些项目:

    return list(itertools.permutations(numbers))
    

    【讨论】:

    • 是的,这是个好主意。您能否详细说明如何从这个递归函数返回数字列表,而不是仅仅将它们打印到屏幕上?
    • 上面的list 表达式被插入到函数最终返回之前。您可以检查partial 以查看这是否是顶级调用。
    【解决方案2】:

    这样做:

    import itertools
    
    numbers = [3,9,8,4,5,7,10]
    length = 3
    target = 15
    
    iterable = itertools.permutations(numbers,length)
    predicate = lambda x: (sum(x) == target)
    vals = filter(predicate,iterable)
    list(vals)
    

    或单线:

    vals = [x for x in itertools.permutations(numbers,length) if sum(x) == target]
    

    结果:

    [(3, 8, 4),
     (3, 4, 8),
     (3, 5, 7),
     (3, 7, 5),
     (8, 3, 4),
     (8, 4, 3),
     (4, 3, 8),
     (4, 8, 3),
     (5, 3, 7),
     (5, 7, 3),
     (7, 3, 5),
     (7, 5, 3)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 2019-05-31
      • 1970-01-01
      • 2021-06-07
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多