(重新发布,因为我对之前的帖子没有任何回复)
我正在尝试编写Python代码以将数字'n'的弱整数组成部分(分区)转换为'k'部分,但每个分区上都有MINIMUM和MAXIMUM值约束(请参见下面的示例)。同样,必须按字典顺序生成分区。我发现了一些相关的帖子,但无法实现。任何帮助将不胜感激。
示例:
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]
在强加分区中的每个整数具有MINIMUM值0和MAXIMUM值3的约束之后,我应该得到:
仅限[3,2,0],[3,1,1],[3,0,2]等。
相关文章:
Elegant Python code for Integer Partitioning
Generate lexicographic series efficiently in Python
答案 0 :(得分:1)
使用递归生成器函数最容易解决此类问题。要将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)