拆分总和K方式组合Python

时间:2019-05-09 15:49:03

标签: python combinatorics

我的总密度为N。我需要找到所有方法,可以将密度分成k组,并假设某些最小可分的部分d。

所以,如果N = 4,k = 3,d = 1,我需要:

[
    (1, 1, 2),
    (1, 2, 1),
    (2, 1, 1),
]

如果N = 5,k = 3,d = 1:

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

这样的感觉应该符合一些基本的组合问题,但我想不到。 This post引用了R中非常相似的操作,但没有引用python。

一种朴素的处理方式是将itertools.product的结果仅过滤到总和为N的元组,但这感觉并不雅致:

import itertools


def compositions(N, k, d=1):
    for seq in itertools.product(*[range(d, N, d)] * k):
        if sum(seq) == N:
            yield seq

示例

>>> list(compositions(7, 3))
[(1, 1, 5),
 (1, 2, 4),
 (1, 3, 3),
 (1, 4, 2),
 (1, 5, 1),
 (2, 1, 4),
 (2, 2, 3),
 (2, 3, 2),
 (2, 4, 1),
 (3, 1, 3),
 (3, 2, 2),
 (3, 3, 1),
 (4, 1, 2),
 (4, 2, 1),
 (5, 1, 1)]

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

您可以假设d = 1,因为如果没有,则可以用d归一化N,即N'= N / d,现在d = 1。

代码如下:

php bin/console regenerate-app-secret