Python 创建显示集合中所有可能的数字组合的算法

Python 创建显示集合中所有可能的数字组合的算法,python,algorithm,Python,Algorithm,我已经在这个问题上纠缠了好几天了。该程序将有一组8个数字,如coins=[1,0,3,0,2,1,0,1],我正在尝试编写它以返回这些数字的每一个可能的集合。例如,每个元素都是它自己的硬币计数,它返回的是我能拥有的所有可能的硬币组合 例如[0,0,3,0,2,1,0,1]、[1,0,2,0,2,1,0,1]、[1,0,1,0,1,1]等,直到存储所有组合 如果我理解清楚,[1,0,3,0,2,1,0,1]意味着你有8枚硬币,1枚A面额硬币,3枚C面额硬币,2枚E面额硬币,1枚F面额硬币和1枚G面

我已经在这个问题上纠缠了好几天了。该程序将有一组8个数字,如coins=[1,0,3,0,2,1,0,1],我正在尝试编写它以返回这些数字的每一个可能的集合。例如,每个元素都是它自己的硬币计数,它返回的是我能拥有的所有可能的硬币组合

例如[0,0,3,0,2,1,0,1]、[1,0,2,0,2,1,0,1]、[1,0,1,0,1,1]等,直到存储所有组合


如果我理解清楚,[1,0,3,0,2,1,0,1]意味着你有8枚硬币,1枚A面额硬币,3枚C面额硬币,2枚E面额硬币,1枚F面额硬币和1枚G面额硬币,你想得到这套硬币的所有子集

您可以使用递归来解决较短列表(没有第一个条目)的问题,然后使用递归调用返回的集合的笛卡尔积,以及遗漏的条目的所有可能值。在递归的最深层,列表将是空的,然后显然只有一个组合返回:一个空列表

def combinations(coins):
    if len(coins) == 0:
        return [coins]
    return [[i] + combi for i in range(coins[0]+1) for combi in combinations(coins[1:])]

# example call:
print(combinations([2,0,3]))
如果不使用列表理解,它将如下所示:

def combinations(coins):
    if len(coins) == 0:
        return [coins]
    res = []
    for i in range(coins[0]+1):
        for combi in combinations(coins[1:]):
            res.append([i] + combi)
    return res

查看
itertools.permutations
。检查:您不清楚“组合”是什么意思。