分裂总和K路组合数学

2024-09-25 00:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个总密度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)]

还有其他想法吗?你知道吗


Tags: 方法inimportfordefproductthispost