当前位置: 首页 > 知识库问答 >
问题:

在Python中将整数n生成限制的弱整数组合(或分区)

和丰羽
2023-03-14

(重新发布,因为我之前的帖子没有得到任何回复)
我正在尝试编写一个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]
在施加约束,即分区中的每个整数都有一个MINIMUM值0和一个MAXIMUM值3之后,我应该得到:
[3,2,0],[3,1,1],[3,0,2],...

相关帖子:
用于整数分区的优雅Python代码
在Python中高效地生成字典序列

共有1个答案

刘泰
2023-03-14

这类问题最容易用递归生成函数来解决。要将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)
 类似资料:
  • 问题内容: (重新发布,因为我没有对之前的帖子做出任何回应) 我试图编写一个Python代码以将数字为’n’的弱整数组合(分区)转换为’k’部分,但要使用MINIMUM和MAXIMUM每个分区上的值约束(请参见下面的示例)。同样,必须按字典顺序生成分区。我发现了一些相关的帖子,但无法实现。任何帮助将不胜感激。 范例: n = 5的整数分割区(k = 3): [5,0,0],[4,1,0],[4,0

  • 把一个int型数组中的数字拼成一个串,这个串代表的数字最小。 #思路说明 对这个问题的理解: 有一个元素是int类型的list; 将上述list中的每个元素的数字分别取出来,然后将这些数字的顺序进行从新排列,并将其中的最小整数输入,就是题目中要求的最小数字。 如果按照上述理解,在解题中,最应当小心的是数字如果很大,比如list中的某个int元素是:2222222222222277777777777

  • 有没有一种简单的方法来生成

  • 问题内容: 我用来优化一个实际问题,答案只能是整数。我当前的代码如下所示: 这样产生: 但是我希望使用整数值对其进行优化(将所有数值四舍五入到最接近的整数并不总是给出最小值)。 有没有办法只使用整数值? (我想我可以创建一个具有所有可能排列的数组,并为每个组合评估f(x),但这似乎不是一个非常优雅或快速的解决方案。) 问题答案: 纸浆溶液 经过研究,我认为您的目标函数不是线性的。我在Python纸

  • 问题内容: 我有两个值: [3:6] 我试图在Golang中玩一些游戏,但是我找不到能够根据这些值创建数组的好方法。 我要实现的目标是: 问题答案: 您可以利用该构造使其更紧凑甚至更快: 出于好奇,可以在不使用循环变量的情况下实现循环,但是这样会更慢,并且代码也更长。通过递减: 或递增:

  • 问题内容: 我正在尝试进行多项选择调查,以允许用户从选项1-x中进行选择。如何做到这一点,以便用户输入除数字以外的任何字符,返回“那是无效答案”之类的内容 问题答案: 您的代码将变为: 它的工作方式是使循环无限循环,直到仅放入数字为止。因此,如果我输入“ 1”,它将破坏循环。但是如果我放“ Fooey!” 该语句将捕获“将引发的错误” ,并且该循环将循环,因为它没有被破坏。