在Python中生成整数n到k个部分的有限弱整数组合(或分割)

2024-06-25 23:00:13 发布

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

(重新发布,因为我之前的帖子没有得到任何回复)
我正试图编写一个Python代码来生成一个数为n的弱整数组合(分区)到k的部分,但是每个分区上都有一个最小值和最大值约束(参见下面给出的示例)。此外,分区必须按字典顺序生成。我找到了一些相关的帖子,但没能实现。任何帮助都将不胜感激。你知道吗

示例:
k=3部分中n=5的可能整数分区:
[5,0,0],[4,1,0],[4,0,1],[3,2,0],[3,1,1],[3,0,2],…,[0,0,5]
在设置分区中每个整数的最小值为0,最大值为3的约束之后,我应该得到:
[3,2,0],[3,1,1],[3,0,2],…以此类推。你知道吗

相关岗位:
Elegant Python code for Integer Partitioning
Generate lexicographic series efficiently in Python


Tags: 代码示例for字典顺序code整数integer
1条回答
网友
1楼 · 发布于 2024-06-25 23:00:13

这类问题最容易用递归生成函数来解决。要将n分区为k部分,我们可以选择第一部分v,然后递归地将n - v分区为k - 1部分。你知道吗

您希望早期的解决方案在第一个位置有较大的数字,因此我们将按降序选择v。你知道吗

def constrained_partitions(n, k, min_elem, max_elem):
    allowed = range(max_elem, min_elem-1, -1)

    def helper(n, k, t):
        if k == 0:
            if n == 0:
                yield t
        elif k == 1:
            if n in allowed:
                yield t + (n,)
        elif min_elem * k <= n <= max_elem * k:
            for v in allowed:
                yield from helper(n - v, k - 1, t + (v,))

    return helper(n, k, ())

示例:

>>> for p in constrained_partitions(5, 3, 0, 3):
...     print(p)
... 
(3, 2, 0)
(3, 1, 1)
(3, 0, 2)
(2, 3, 0)
(2, 2, 1)
(2, 1, 2)
(2, 0, 3)
(1, 3, 1)
(1, 2, 2)
(1, 1, 3)
(0, 3, 2)
(0, 2, 3)

相关问题 更多 >