获取数字组合,其中每个数字都低于特定数字

时间:2018-10-12 02:23:12

标签: python

给定长度@GeneratedValue(strategy = GenerationType.AUTO)ktarget,我想得到一个数字组合,其中每个数字包含limit,可以有[0 ~ limit]个数字,并且总计为k

例如,如果我有target k=2target=4

我会

limit=4

我已经尝试了上面的方法,但是这个方法没有限制。

2 个答案:

答案 0 :(得分:3)

您快到了!您可以进行非常简单的修改以解决此限制。

def get_combination(spots, target, limit):
    if spots == 1 and target <= limit:
        yield (target, )
    elif spots > 1:
        for i in range(limit + 1):
            for j in get_combination(spots - 1, target - i, limit):
                yield (i, ) + j

当我们得出spots == 1的基本情况时,我们要确保余数小于限制。如果不是,则不要产生任何东西。然后,当我们选择要加入组合的数字时,请勿选择超出限制的任何内容!

>>> list(get_combination(2,4,3))
[(1, 3), (2, 2), (3, 1)]

答案 1 :(得分:0)

您可以像这样将limit应用于现有功能:

def get_combination(spots, target, limit):
    if spots != 1:
        for i in range(limit + 1):
            for j in get_combination(spots - 1, target - i, limit):
                yield (i, ) + j
    elif 0 <= target <= limit:
        yield (target,)

这样:

print(list(get_combination(3, 8, 4)))

将输出:

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