找到 x_1 + x_2 ...=n 的非负整数解的算法

计算科学 线性代数 算法
2021-12-29 07:30:22

我知道方程的解数

x1+x2+x3+...+xk=n
(n+k1k1)

有没有一种算法可以真正找到这个方程的所有解,而不必用蛮力?

2个回答

列出所有解决方案的算法在 Dennis Stanton 和 Dennis White 的教科书“Constructive Combinatorics”中给出。

也许对解决方案的“蛮力”枚举的性质存在一些误解。无论如何,在导航由解决方案组成的搜索树时,基本上可以消除猜测。

个循环很容易实现解决方案的有效生成,索引每个从零到的“运行计数”减去分配给任何给定嵌套级别的外部索引的总和。这可以通过在递归调用的例程中使ki1,,iknk

这些解决方案被称为的有序分区(或(弱)组合,并且问题中给出的这些计数很容易通过Stars and Bars 参数确定。n

如果求和的顺序不重要,或者可能在调用算法中被考虑,则可以通过生成具有被限制为升序(相当于降序)排列的求和的解决方案来获得一些效率,这被称为(无序)划分为最多个和数。[严格来说,分区必须是正整数的总和,但对最多个加数的限制允许通过将任何“缺失”的加数设为零来实现简单的簿记约定。]nkk

弱组合(有序分区)的嵌套循环或递归函数实现很容易适应生成(无序)分区,只需将索引限制在由下一个更高级别索引(以及的剩余部分)限制的上限待分配)和一个下限,允许的剩余部分通过剩余要填充的总和数来获得。nn