首页 文章

整数分区[1]

提问于
浏览
3

正整数 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 回答

  • 1

    递归呢?要获得{n,m,k}的每个允许的分区,请为[2]中的每个 j 取一个[1] =j,然后是{n-j,m-1,j}的每个允许的分区。

相关问题