python - 在 Python 中将整数 n 生成受限弱整数组合(或分区)为 k 部分

标签 python combinations combinatorics lexicographic integer-partition

(重新发帖,因为我之前的帖子没有得到任何回复)
我正在尝试编写一个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

最佳答案

使用递归生成器函数可以最直接地解决此类问题。要将n划分为k部分,我们可以选择第一部分v,然后递归划分n - v code> 分成 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)

关于python - 在 Python 中将整数 n 生成受限弱整数组合(或分区)为 k 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915599/

相关文章:

r - 无论位置如何,寻找独特的组合

mySQL获取某些行的所有可能组合

arrays - 查找数组组合的中点

php - 使用php在递归函数中合并数组?

python - 箱装/背包变化 : Fitting discrete data into discrete servers

python - 如何估计累积高斯拟合的正确参数?

python - 魔术命令 %edit 应该在 iPython 中调用 IDLE

python - Bjoern v/s Gunicorn POST 请求

python - 如何使用python补充时间序列中缺失的数据?

生成移位字符组合所需的算法