[转]两个java写的组合算法
import java.io.*;public class Comb {public void combine(int[] list, int k, int l, int r, int n) {if (k + l > n + 1)return;if (l == 0) {for (int i = 0; i < r; i++)System.out.print(list[i] + " ");System.out.println();return;}list[r - l] = k;combine(list, k + 1, l - 1, r, n);if (k + l <= n)combine(list, k + 1, l, r, n);}public static void main(String[] args) throws NumberFormatException,IOException {Comb obj = new Comb();BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("Please input n: ");int n = Integer.parseInt(br.readLine());System.out.println("Please input r: ");int r = Integer.parseInt(br.readLine());int[] list = new int[r];int k = 1;int l = r;obj.combine(list, k, l, r, n);}}?import java.io.*;public class Choose { int init[]; int end[]; int n; int m; BufferedReader in; public Choose() { in=new BufferedReader(new InputStreamReader(System.in)); n=getInput("Please enter the totle number n ( that is 1~n and n>0 ) : "); m=getInput("Please enter the number of integers to be selected m ( 0<m<=n ) : "); while(n<m) m=getInput("Wrong!! Attention m<=n !!\n Please enter the number of integers to be selected m ( 0<m<=n ) : "); init=new int[n]; for(int i=1;i<=n;i++) init[i-1]=i; end=new int[m]; } public static void main(String arf[]) { Choose demo=new Choose(); System.out.println("--------递 归--------"); demo.choose1(0,0); System.out.println("--------非递归--------"); demo.choose2(); } //递归算法-------------------------- public void choose1(int k,int l) { if(l==m) { for(int i=0;i<m;i++) System.out.print(end[i]+" "); System.out.println(); } else if(n-k==m-l) { for(int i=0;i<m-l;i++) end[l+i]=init[k+i]; for(int i=0;i<m;i++) System.out.print(end[i]+" "); System.out.println(); } else { end[l]=init[k]; choose1(k+1,l+1); choose1(k+1,l); } } //非递归算法---------------- public void choose2() { int trace=0; for(int i=0;i<n;) { if(n-i==m-trace) { for(int j=0;j<m-trace;j++) end[trace+j]=init[i+j]; for(int j=0;j<m;j++) System.out.print(end[j]+" "); System.out.println(); if(trace==0) break; i=end[--trace]; } else if(trace==m) { for(int j=0;j<m;j++) System.out.print(end[j]+" "); System.out.println(); i=end[--trace]; } else end[trace++]=init[i++]; } } //--------------------------------- public int getInput(String info) { int temp=0; System.out.print("\n"+info); try { temp=Integer.parseInt(in.readLine()); } catch(Exception e) { System.out.println("Wrong!! Input again!!"); return getInput(info); } if(temp<=0) { System.out.println("\nWrong!! Should grater than 0 !"); return getInput("Enter again : "); } else return temp; } }?