python - 在 Python 上使用回溯的子集总和

标签 python recursion subset backtracking

所以我想打印出初始集合的所有子集,这些子集加起来为 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 - 在 Python 上使用回溯的子集总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29456502/

相关文章:

r - 用于按组 ID 子集数据的 for 循环的更高性能替代方案是什么?

python - 根据列值在 DataFrame 中查找下一行

python - 删除除一列之外的所有 Pandas 数据框?

javascript - 如何使用事件驱动模型 "keep trying until it works"?

python - 递归树遍历将结果添加到python中的嵌套字典

r - 从另一列中选择显示至少一个值的唯一条目

arrays - 数组加法,为什么从 'i = 2' 开始?

python - 美丽汤中的错误 : You don't have permission to access "url" on this server.

python - 使用装饰器与迭代来设置值?

java - 我的递归出了什么问题