Java 在不将组合存储到内存的情况下逐个获取组合的算法

Java 在不将组合存储到内存的情况下逐个获取组合的算法,java,algorithm,combinatorics,Java,Algorithm,Combinatorics,我有一个长度为N int的数组,我有一个输入int X。我需要用int的组合填充整个数组,其和为X。我需要找到所有可能的组合,顺序很重要,数组具有固定长度(const N)。例如,如果X=3,N=4,我需要得到: [3, 0, 0, 0] [2, 1, 0, 0] [2, 0, 1, 0] [2, 0, 0, 1] [1, 2, 0, 0] [1, 1, 1, 0] [1, 1, 0, 1] [1, 0, 2, 0] [1, 0, 1, 1] [1, 0, 0, 2] [0, 3, 0, 0]

我有一个长度为N int的数组,我有一个输入int X。我需要用int的组合填充整个数组,其和为X。我需要找到所有可能的组合,顺序很重要,数组具有固定长度(const N)。例如,如果X=3,N=4,我需要得到:

[3, 0, 0, 0]
[2, 1, 0, 0]
[2, 0, 1, 0]
[2, 0, 0, 1]
[1, 2, 0, 0]
[1, 1, 1, 0]
[1, 1, 0, 1]
[1, 0, 2, 0]
[1, 0, 1, 1]
[1, 0, 0, 2]
[0, 3, 0, 0]
[0, 2, 1, 0]
[0, 2, 0, 1]
[0, 1, 2, 0]
[0, 1, 1, 1]
[0, 1, 0, 2]
[0, 0, 3, 0]
[0, 0, 2, 1]
[0, 0, 1, 2]
[0, 0, 0, 3]
此外,我不想在内存中存储所有可能的组合,但我需要一个接一个地获取这些值。例如,上次我得到[0,2,0,1]时调用了一个方法。当我再次调用它时,我需要得到下一个组合[0,1,2,0]。当我再次调用它时,我需要得到[0,1,1,1]等等。
有没有一种方法可以做到这一点?谢谢

我已经修改了colex中的合成生成,以适合您的订购。
使用Delphi代码,我希望它是可以理解的(
Dec(P)
等于
P--

输出

3 0 0 0 
2 1 0 0 
2 0 1 0 
2 0 0 1 
1 2 0 0 
1 1 1 0 
1 1 0 1 
1 0 2 0 
1 0 1 1 
1 0 0 2 
0 3 0 0 
0 2 1 0 
0 2 0 1 
0 1 2 0 
0 1 1 1 
0 1 0 2 
0 0 3 0 
0 0 2 1 
0 0 1 2 
0 0 0 3 

为了避免内存问题,您可能希望存储一系列链式迭代器,这些迭代器只保留它们到目前为止达到的索引“I have a array[N]of int”和“数组中所有值的组合”。这个问题听起来表述得很糟糕。也就是说,如果你有一个像{0,1,2,3}这样的数组,那么有2^4个可能的组合(在定义的组合意义上),并且只有以下组合匹配,例如3{1,2},{0,1,2},{3},{0,3}@juvian不是重复的,这是一个不同的问题。@Vojtech它完全相同,除非在你的情况下,你不想使用超过N个数字,但是提出的解决方案可以很容易地修改以增加限制。我更新了描述,希望区别现在更清楚。太好了,它如此简单,它完全符合我的需要。非常感谢。
3 0 0 0 
2 1 0 0 
2 0 1 0 
2 0 0 1 
1 2 0 0 
1 1 1 0 
1 1 0 1 
1 0 2 0 
1 0 1 1 
1 0 0 2 
0 3 0 0 
0 2 1 0 
0 2 0 1 
0 1 2 0 
0 1 1 1 
0 1 0 2 
0 0 3 0 
0 0 2 1 
0 0 1 2 
0 0 0 3