正整数n的分区是正整数的非递增数组
a [1],a [2],...,a [m]
满足
a [1] + a [2] + ... + a [m] = n。
m称为此分区的长度。
我们可以按指定的顺序列出n的所有分区。例如,如果我们使用该规则 词典编纂对所有英语单词进行排序,称为词典顺序。另一种方法是,如果我们使用C语言比较字符串的规则,则称为反向词典编排顺序。还有一个紧凑的订单。
要生成整数n的所有分区,我们有一个很好的算法,由Stojmenovic提出,已经包含在Knuth的书中。
要生成长度恰好为m的n的所有分区,我们可以使用colex顺序,这个算法也包含在Knuth的书中。
要生成n的所有分区,其所有元素不超过k,我们可以使用1中的算法,只需更改其初始条件和循环的退出条件。
我的问题出现了:如何生成长度恰好为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!
的反转分区答案 0 :(得分:1)
递归怎么样?为了获得{n,m,k}的每个允许分区,对[1,k]中的每个j取一个[1] = j,然后是{n-j,m-1,j}的每个允许分区。