22选5的全部组合public class Combine { public static int[] outPut = new int[5];//结果集 public static int[] inPut = new int[22]; public static void main(String[] args) { //初始化 for (int i = 1; i <= 22; i++) { inPut[i - 1] = i; } combine(21, 4);//22选5 } public static void combine(int n, int k) { int i, j; for (i = n; i >= k; i--) { outPut[k] = inPut[i]; if (k > 0) combine(i - 1, k - 1);//递归 else { for (j = 0; j < 5; j++) System.out.print(outPut[j] + ","); System.out.println(); } } }}
n!/((n-m)!m!)
不考虑顺序的那种
n!/[(n-m)!m!]
public static int[] outPut = new int[5];//结果集 public static int[] inPut = new int[22]; public static void main(String[] args) {
//初始化
for (int i = 1; i <= 22; i++) {
inPut[i - 1] = i;
}
combine(21, 4);//22选5
} public static void combine(int n, int k) {
int i, j;
for (i = n; i >= k; i--) {
outPut[k] = inPut[i]; if (k > 0)
combine(i - 1, k - 1);//递归
else {
for (j = 0; j < 5; j++)
System.out.print(outPut[j] + ",");
System.out.println(); }
}
}}
一般组合算法:
假如一个组合可以表示为:c1c2.....cr
(1),求满足不等式cj<n-r+j的最大下表i,
即i=max{j|cj<n-r+j}
(2),ci= ci+1;
(3),cj=c(j-1)+1,j=i+1,i+2.....r
上述是求从n个数中选出r个的组合数