当前位置: 首页 > 面试题库 >

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

郑狐若
2023-03-14
问题内容

(重新发布,因为我没有对之前的帖子做出任何回应)
我试图编写一个Python代码以将数字为’n’的弱整数组合(分区)转换为’k’部分,但要使用MINIMUM和MAXIMUM每个分区上的值约束(请参见下面的示例)。同样,必须按字典顺序生成分区。我发现了一些相关的帖子,但无法实现。任何帮助将不胜感激。

范例:
n = 5的整数分割区(k = 3):
[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中有效地生成词典序列


问题答案:

使用递归生成器函数最容易解决此类问题。要生成n分成k几部分的分区,我们可以选择第一个part 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”部分,但每个分区上都有最小值和最大值约束(见下面给出的示例)。此外,分区必须按字典顺序生成。我已经找到了一些相关的帖子,但没有能够实现。任何帮助都将不胜感激。 示例: 在k=3个部分中n=5的可能整数分区: [5,0,0],[4,1,0],[4,0,1],[3,2,0]

  • 我试图找到或开发Python的整数分区代码。 仅供参考,整数分区将给定的整数n表示为小于n的整数之和。例如,整数5可以表示为 我已经找到了很多解决方案。http://homepages.ed.ac.uk/jkellehe/partitions.php和http://code.activestate.com/recipes/218332-generator-for-integer-partition

  • 我一直陷在这个问题中,找不到有效的解决办法。 我有N(高达1000万)说最大100个元素的数组。这些数组包含1-10000的数字。 现在我的问题是将这些数组划分为K个组,这样我就可以最小化所有数组中的重复项,即一个数组包含1,4,10,100,另一个数组包含1100。我希望他们进入同一组,因为这样可以最大限度地减少口是心非。我的问题的两个限制条件如下- > 组中向量的数量应均匀分布。 根据大小以递

  • 整数n的划分是将n写成正整数和的一种方式。对于 例如,对于n=7,一个分区是1 1 5。我需要一个程序来查找所有 使用“r”整数对整数“n”进行分区。例如,

  • 问题内容: 我见过类似的问题,但没有一个提供我所要的答案,因此,如果这被认为是重复的,我在此致歉。我正在尝试将数组{1,2,3}和{4,5,6}合并为{1,2,3,4,5,6}。我做错了什么?我是java的新手。抱歉,问题很愚蠢。 问题答案: 代替 您需要调用merge方法,并将结果分配给数组,例如: 您的for循环也应该是:

  • 我试图以字典顺序生成给定整数N N编号K的适当分区,例如对于N=5,K=3我们得到: 第三个是。如何在不生成每个分区的情况下生成它(在C语言中,但最重要的是我需要算法)? 要找到分区中的最大数(假设我们可以找到分区数,其中是数字,是其分区中的最大整数),然后减少我们正在寻找的原始数和数。所以是的,我正在尝试使用动态编程。仍在研究代码。 这根本不起作用: