利用递归的思想和组合数公式,可以实现组合数的枚举,代码如下:
import java.util.ArrayList;
public class Exhaustion {
public static void main(String [] args){
Exhaustion ex = new Exhaustion();
ex.nchoosek(1,5,4,new ArrayList<Integer>());
}
public void nchoosek(int n_start, int n_end, int k, ArrayList<Integer> list){
if (k == 1){
for (int i = n_start; i <= n_end; i ++){
ArrayList<Integer> list_2 = (ArrayList<Integer>) list.clone();
list_2.add(i);
System.out.println(list_2);//对枚举结果的处理
list_2 = null;
}
}
else if (n_end - n_start + 1 == k){
ArrayList <Integer> list_2 = (ArrayList<Integer>) list.clone();
for (int i = n_start; i <= n_end; i ++){
list_2.add(i);
}
System.out.println(list_2);//对枚举结果的处理
list_2 = null;
}
else{
nchoosek(n_start, n_end-1, k, list);
ArrayList<Integer> list_2 = (ArrayList<Integer>) list.clone();
list_2.add(n_end);
nchoosek(n_start, n_end-1, k-1, list_2);
list_2 = null;
}
}
}
可以将代码中的两处System.out.println(list_2)改为对枚举结果的操作。
输出结果:
[1, 2, 3, 4]
[5, 1, 2, 3]
[5, 4, 1, 2]
[5, 4, 3, 1]
[5, 4, 3, 2]