正整数 n 的分区是正整数的 non-increasing 数组
a [2],a [3],...,a [4]
满意
a [5] a [6] ... a [7] = n。
m 称为该分区的长度。
我们可以按指定顺序列出 n 的所有分区。例如,如果我们使用词典顺序对所有英语单词进行排序的规则,则称为词典顺序。另一种方式,如果我们使用 C 语言比较字符串的规则,则称为反向词典顺序。还有一个 colex 订单。
-
为了生成整数 n 的所有分区,我们有一个由 Stojmenovic 提出的不错的算法,该算法已经包含在 Knuth 的书中。
-
要生成长度为 m 的 n 个所有分区,我们可以使用 colex 顺序,该算法也包含在 Knuth 的书中。
-
要生成 n 个所有元素不超过 k 的所有分区,我们可以在 1 中使用算法,只需更改其初始条件和循环的退出条件即可。
我的问题来了:如何生成长度恰好为 m 且元素不超过 k 的分区?
这里 m 和 k 是常数。当然,其元素不超过 k 的分区等于其不超过 k 的第一个元素。
哦,我想我已经解决了。对于
a [8] a [9] ... a [10] = n
可以写成
(k 1-a [11])(k 1-a [12])...(k 1-a [13])= m(k 1)-n
而后者只是 m(k 1)-n 的反向分区!
1 回答
递归呢?要获得{n,m,k}的每个允许的分区,请为[2]中的每个 j 取一个[1] =j,然后是{n-j,m-1,j}的每个允许的分区。