簡體   English   中英

Python回溯的子集總和

[英]Subset Sum with Backtracking on Python

因此,我想打印出初始集合的所有子集,這些子集總計為21。到目前為止,我只想出了這個

def twentyone(array, num=21):
    if len(array) == 0:
        return None
    else:
        if array[0] == num:
            return [array[0]]
        else:
            with_v = twentyone(array[1:], (num - array[0]))
            if with_v:
                return [array[0]] + with_v
            else:
                return twentyone(array[1:], num)

它確實給出了解決方案,但只有第一個。 我如何更改它,以便它將給我所有可能的子集。 我嘗試進行一些更改,但它只給了我嵌套列表。 你能幫忙的話,我會很高興。

您可以創建一個遞歸生成器:

def twentyone(array, num=21):
    if num < 0:
        return
    if len(array) == 0:
        if num == 0:
            yield []
        return
    for solution in twentyone(array[1:], num):
        yield solution
    for solution in twentyone(array[1:], num - array[0]):
        yield [array[0]] + solution

例:

>>> list(twentyone([5, 16, 3, 2]))
[[16, 3, 2], [5, 16]]

如果允許您使用標准的Python庫,請使用以下較短的解決方案:

import itertools
import operator


def twentyone(array, num=21):
    subsets = reduce(operator.add, [list(itertools.combinations(array, r)) for r in range(1, 1 + len(array))])
    return [subset for subset in subsets if sum(subset) == num]


print twentyone([1, 2, 5, 6, 8, 9, 10])

結果:

[(2, 9, 10), (5, 6, 10), (1, 2, 8, 10), (1, 5, 6, 9), (2, 5, 6, 8)]

暫無
暫無

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

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