`

[转]两个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;        
    }    
}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics