【问题标题】:split total sum K ways combinatorics python拆分总和K方式组合python
【发布时间】:2020-03-25 05:30:58
【问题描述】:

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

还有其他想法吗?

【问题讨论】:

    标签: python combinatorics


    【解决方案1】:

    您可以假设 d=1,因为如果不是,那么您可以用 d 标准化 N,即 N' = N/d,现在 d=1。

    代码如下:

    import itertools
    
    def divisions(N, k):
        for q in itertools.combinations(range(N - 1), k - 1):
            yield [j - i for i, j in zip((-1,) + q, q + (N - 1,))]
    
    answer = [x for x in divisions(7, 3)]
    print(answer)
    

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2013-01-06
      • 1970-01-01
      • 2012-11-20
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多