限制整数组合

时间:2016-08-19 16:11:43

标签: python combinations

如何生成allowed_ints总和为goal的组合列表?

示例:

allowed_ints=[1,2], goal=4
combinations = [[1,1,1,1],[1,1,2],[2,1,1],[2,2],[1,2,1]]

allowed_ints=[5, 6], goal=13
combinations =  []

到目前为止,我所做的并不奏效。

def combinations(allowed_ints, goal):
    if goal > 0:
        for i in allowed_ints:
            for p in combinations(allowed_ints, goal-i):
                yield [i] + p
    else:
        yield []

print list(combinations([1, 2],3))
[[1, 1, 1], [1, 1, 2], [1, 2], [2, 1], [2, 2]] # not what I want

3 个答案:

答案 0 :(得分:1)

使用你的功能试试这个:

def combinations(allowed_ints, goal):
    if goal > 0:
        for i in allowed_ints:
            for p in combinations(allowed_ints, goal-i):
                if sum([i] + p) == goal:
                    yield [i] + p
    else:
        yield []

print list(combinations([1, 2],3))

输出:

[[1, 1, 1], [1, 2], [2, 1]]

答案 1 :(得分:0)

我知道你已经选择了一个答案,但我想提供一个与你的代码不太相似的替代品。如果你想使用递归,我会建议像这样:

def combinations(allowed_ints, list, goal):
    # base case: you're done
    if sum(list) == goal:
        print list
    # if overshoot, stop here
    elif sum(list) > goal:
        pass
    else:
        for i in allowed_ints:
            new_list = list[:]
            new_list.append(i)
            combinations(allowed_ints, new_list, goal)

combinations([1, 2],[],4)

这并不比建议的答案好,但采用了不同的方法。

答案 2 :(得分:-1)

您应该包含3个条件,例如

目标== 0然后递归工作

目标< 0然后递归失败

目标> = 0并且列表元素结束然后递归失败

顺便说一句,你可以使用递归来完成所有操作。不需要循环,递归也可以做循环