簡體   English   中英

查找(或生成)等於給定總和的正數的所有可能組合(以給定長度)。(python)

[英]Finding(or Generating) all possible combinations(at a given length) of positive numbers that equals a given sum.(python)

我試圖找到最有效的方法來找到等於給定總和的所有數字組合。

例如:尋找總和 = 3 的所有 3 數組合

期望輸出:[0,0,3], [0,3,0], [3,0,0], [1,1,1], [1,2,0], [1,2,0] , [2,1,0], [2,0,1]

在應用方面,我試圖生成等於 100 的所有 3 編號組合的列表。我嘗試通過創建一個包含數字 0 - 100 的列表作為輸入參數和以下代碼來實現這一點:

 def weightList():
     l=[]
     for x in range(0,101):
         l.append(x)
     return l

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

     # check if the partial sum is equals to target
        if (s == target)&(len(partial) == LoanCount): 
            print(partial)
        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, partial + [n]) 
  o=weightList()
  subset_sum(o,100)

問題是由於它必須執行的迭代數量太長。 我還需要包含重復元素的組合和不同的元素順序/序列。 這個方法不行。 誰能為我提供一種更快/更有效的方法來獲得我想要的結果?

您可以使用生成器找到等於給定總和的 3 個數字的所有可能組合:

def gen_combo_target(s):
    for i in range(s + 1):
        s2 = s - i
        for j in range(s2 + 1):
            yield (i, j , s - i - j)

list(gen_combo_target(3))

輸出:

[(0, 0, 3),
 (0, 1, 2),
 (0, 2, 1),
 (0, 3, 0),
 (1, 0, 2),
 (1, 1, 1),
 (1, 2, 0),
 (2, 0, 1),
 (2, 1, 0),
 (3, 0, 0)]

看看星星和酒吧的問題。 問題是,即使是最快的解決方案仍然會很慢,因為答案的數量非常多(可能是 N 的數量級!),並且任何正確的解決方案都需要得到所有答案。

這是我對解決方案的看法:

def get_combinations(n, k): # gets all lists of size k summing to n
    ans = []
    def solve(rem, depth, k, cur):
        if depth == k:
            ans.append(cur)
        elif depth == k-1:
            solve(0, depth+1, k, cur + [rem])
        else:
            for i in range(rem+1):
                solve(rem-i, depth+1, k, cur+[i])
    solve(n, 0, k, [])
    return ans

print (get_combinations(3,3))

盡可能快地找到所有可能的列表。 但是,如果您只想找到此類列表的數量,則可以使用上面引用的星形和條形方法更快地完成。

您還可以像這樣使用生成器和 python itertools:

from itertools import product

def comb(nx):
    list_gen = (n for n in range(nx+1))
    list_ = (list(list_gen))
    prod = [seq for seq in product(list_, list_, list_) if sum(seq) == nx]    
    print(list(prod))

結果:

[(0, 0, 3), (0, 1, 2), (0, 2, 1), (0, 3, 0), (1, 0, 2), (1, 1, 1), (1, 2, 0), (2, 0, 1), (2, 1, 0), (3, 0, 0)]

它可以在我的機器上運行大約 10 us:

9.53 µs ± 177 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM