整数分区

时间:2010-10-16 07:31:43

标签: algorithm combinatorics

正整数n的分区是正整数的非递增数组

a [1],a [2],...,a [m]

满足

a [1] + a [2] + ... + a [m] = n。

m称为此分区的长度。

我们可以按指定的顺序列出n的所有分区。例如,如果我们使用该规则 词典编纂对所有英语单词进行排序,称为词典顺序。另一种方法是,如果我们使用C语言比较字符串的规则,则称为反向词典编排顺序。还有一个紧凑的订单。

  1. 要生成整数n的所有分区,我们有一个很好的算法,由Stojmenovic提出,已经包含在Knuth的书中。

  2. 要生成长度恰好为m的n的所有分区,我们可以使用colex顺序,这个算法也包含在Knuth的书中。

  3. 要生成n的所有分区,其所有元素不超过k,我们可以使用1中的算法,只需更改其初始条件和循环的退出条件。

  4. 我的问题出现了:如何生成长度恰好为m的分区,其元素不超过k?

    这里m和k是常数。当然,其元素不超过k的分区等同于其不超过k的第一元素。


    哦,我想我已经解决了。为了

    a [1] + a [2] + ... + a [m] = n

    可以写成

    (k + 1-a [1])+(k + 1-a [2])+ ... +(k + 1-a [m])= m(k + 1)-n

    而后者只是m(k + 1)-n!

    的反转分区

1 个答案:

答案 0 :(得分:1)

递归怎么样?为了获得{n,m,k}的每个允许分区,对[1,k]中的每个j取一个[1] = j,然后是{n-j,m-1,j}的每个允许分区。