【问题标题】:Different sums counter of a given set给定集合的不同总和计数器
【发布时间】:2020-07-31 19:07:05
【问题描述】:

我正在编写这段代码(基础代码归功于 Shreyanshi Arun),它打印给定集合的所有子集的总和:

def subsetSums(arr, l, r, sum=0):
    # Print current subset
    if l > r:
        global k
        print(sum,end=" ")
        k += 1
        return

    # Subset including arr[l]
    subsetSums(arr, l + 1, r, sum + arr[l])

    # Subset excluding arr[l]
    subsetSums(arr, l + 1, r, sum)

k = 0
arr = [0.5, 0.5, 1.5, 1.5, 2, 3, 5, 5]
n = len(arr)

subsetSums(arr, 0, n - 1)

print ("\n Combinations:",k)

我正在尝试调整它以接收可能有多少总和的count。当我离开代码时,变量 k 用作和计数器。但是,我希望此计数器仅在结果总和不等于任何前一个时增加。

例如,在这段代码中,结果是这样的:

19.0 14.0 14.0 9.0 16.0 11.0 11.0 6.0 17.0 12.0 12.0 [...]
Combinations: 256

可以看到,例如,第二个和第三个结果是 14.0。在这些情况下,我想避免 k 增加,因为第三个总和等于第二个总和。否则,我所有的组合都将产生 256(对于长度为 8 的数组)。相同的条件应该适用于数组中任何即将出现的重复数字,而不仅仅是直接后继数字。

【问题讨论】:

  • 可以尝试将结果添加到集合中,然后您可以使用集合的长度作为组合数

标签: python subset combinations


【解决方案1】:

创建一个集合来保存所有的总和。将每个和添加到集合中,最后集合的长度将是不同和的数量。

def subsetSums(arr, l, r, sum=0, allSums = None):
    if allSums is None:
        allSums = set()
    # Print current subset
    if l > r:
        allSums.add(sum)
        print(sum,end=" ")
        return len(allSums)

    # Subset including arr[l]
    subsetSums(arr, l + 1, r, sum + arr[l], allSums)

    # Subset excluding arr[l]
    return subsetSums(arr, l + 1, r, sum, allSums)

arr = [0.5, 0.5, 1.5, 1.5, 2, 3, 5, 5]
n = len(arr)

k = subsetSums(arr, 0, n - 1)

【讨论】:

  • 完美!非常感谢。
【解决方案2】:

我不再遍历所有 2n 个子集,而是像这样构建一组总和:

sums = {0}
for x in arr:
    sums |= {s + x for s in sums}
print(len(sums))

或者functools.reduce:

>>> len(reduce(lambda sums, x: sums | {s + x for s in sums}, arr, {0}))
39

【讨论】:

    【解决方案3】:

    这里更好的方法是维护一个哈希表来检查已经出现的总和

    def subsetSums(arr, l, r,sum=0):
    # Print current subset
    if l > r:
        global k
        global sumHash
        print(sum, end=" ")
        if(sum not in sumHash):
            k += 1
        sumHash[sum] = True
        return
    
    # Subset including arr[l]
    subsetSums(arr, l + 1, r,sum + arr[l])
    
    # Subset excluding arr[l]
    subsetSums(arr, l + 1, r, sum)
    
    
    k = 0
    sumHash = dict()
    arr = [0.5, 0.5, 1.5, 1.5, 2, 3, 5, 5]
    n = len(arr)
    
    subsetSums(arr, 0, n - 1)
    
    print("\n Combinations:", k)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2019-03-13
      相关资源
      最近更新 更多