/**
* 获取Cnm(n为下标,m为上标)的可组合的总种类数,由于long限制,n<21
* @param n
* @param m
* @return
*/
public static int cnm(int n,int m){
if(n>20||n<1||n<m){
throw new RuntimeException("n或m取值不当!");
}
long sum=1;
for (int i = m+1; i <=n ; i++) {
sum=sum*i;
}
for (int i = 1; i <n-m+1 ; i++) {
sum=sum/i;
}
return (int)sum;
}
/**
* 获取排列组合Cnm(n为下标,m为上标)的所有种类,以排序下标返回
* 由于long限制,n<21
* @param n
* @param m
* @return
*/
public static int[][] cnmArr(int n,int m){
int num =cnm(n,m);
int[][] arrS= new int[num][m];
int[] arr= new int[m];
for (int i = 0; i <arr.length ; i++) {
arr[i]=i;
}
int i=0;
while (true){
System.arraycopy(arr,0,arrS[i],0,m);
i++;
if(!reSetArr(arr,n,m,m-1)){
break;
}
}
return arrS;
}
private static boolean reSetArr(int[] arr,int n,int m,int index){
if(index<0){
return false;
}
if(arr[index]<n-m+index){
arr[index]++;
for (int j = index; j <arr.length ; j++) {
arr[j]=arr[index]+(j-index);
}
return true;
}else {
return reSetArr(arr,n,m,index-1);
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交