문제는 다음과 같이 분해될 수 있습니다.
1. 먼저 n개의 숫자 중 가장 큰 숫자를 선택한 다음, 나머지 n-1개의 숫자 중에서 m-1개의 숫자를 선택하여 n-(m- 1)개를 선택합니다. 숫자에서 1개의 숫자입니다.
2. n개의 숫자 중에서 다음으로 가장 작은 숫자를 선택하고 현재 선택할 수 있는 최대 숫자가 m이 될 때까지 1단계를 계속합니다.
분명히 위의 방법은 재귀적 프로세스이므로 재귀적 방법을 사용하면 모든 조합을 매우 깔끔하게 얻을 수 있습니다.
코드:
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); } }