Das Problem kann wie folgt zerlegt werden:
1 Wählen Sie zuerst die Zahl mit der größten Zahl aus n Zahlen aus und wählen Sie dann m-1 Zahlen aus den verbleibenden n-1 Zahlen aus, bis n-(m- 1) Wählen Sie aus 1 Nummer aus der Nummer.
2. Wählen Sie die nächstkleinere Zahl aus n Zahlen aus und fahren Sie mit Schritt 1 fort, bis die aktuell maximal auswählbare Zahl m ist.
Offensichtlich ist die obige Methode ein rekursiver Prozess, was bedeutet, dass alle Kombinationen mit der rekursiven Methode sehr sauber erhalten werden können. Code auf
:
package algorithm.ms100; public class CtzHe { private int[] array = {1,2,3,4,5}; private int[] b= new int[3]; private int M = 3; public void combine( int a[], int n, int m) { for(int i=n; i>=m; i--) // 注意这里的循环范围 { b[m-1] = i - 1; if (m > 1) combine(a,i-1,m-1); else // m == 1, 输出一个组合 { for(int j=M-1; j>=0; j--) System.out.print( a[b[j]] + " "); System.out.println(); } } } public static void main(String[] args) { CtzHe c = new CtzHe(); c.combine(c.array, 5, 3); } }