读书人

[转]两个java写的结合算法

发布时间: 2012-10-24 14:15:58 作者: rapoo

[转]两个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;            }    }
?

读书人网 >编程

热点推荐