关于排列组合算法的心得

来源:互联网 发布:全球软件行业市场规模 编辑:程序博客网 时间:2024/06/06 00:49

排列组合数学公式

  1. 排列

    例如:有 9 个球,编号依次为1,2,3,4,5,6,7,8,9;从中随机取出 5 个,一共有多少种方法?(考虑顺序,如12345和54321是两种不同的方法)
    思路:暴力破解

public class T {    public static void main(String[] args) {        int count=0;        for (int i = 1; i <= 9; i++) {            for (int j = 1; j <=9; j++) {                for (int k = 1; k <= 9; k++) {                    for (int w = 1; w <= 9; w++) {                        for (int e = 1; e <= 9; e++) {                            if(i==j||j==k||k==w||w==e||i==e||i==k||i==w||j==w||j==e||k==e);                            else {                                count++;                                System.out.println(i+""+j+""+k+""+w+""+e);                            }                        }                    }                }            }        }        System.out.println(count);    }

2.全排列
1,2,3,4的全排列算法:

public class CRSort {    public static void main(String[] args) {        int[] arr={4,3,2,1};        fn(arr,0);    }    private static void fn(int[] arr, int i) {        if(arr.length==i){            for (int j = 0; j < arr.length; j++) {                System.out.print(arr[j]);            }            System.out.println();            return;        }        for (int j = i; j < arr.length; j++) {            int temp=arr[i];arr[i]=arr[j];arr[j]=temp;            fn(arr, i+1);            temp=arr[i];arr[i]=arr[j];arr[j]=temp;        }    }}

3.组合
例如:有 9 个球,从中随机取出 5 个,一共有多少种方法?
思路:递归

fn(9,5);private static int fn(int i, int j) {        if(i<j) return 0;        if(i==j) return 1;        if(j==0) return 1;        return fn(i-1, j-1)+fn(i-1, j);    }

4.组合(2)
在ABCDE里面任意取出两个?打印所有可能
方法一:

public class B {    public static void main(String[] args) {        Scanner out=new Scanner(System.in);        char[] arr="ABCDE".toCharArray();        fn(arr,arr.length,0,1);    }    private static void fn(char[] arr, int length,int s,int p) {        if(p==length) return;        for (int i = p; i < length; i++) {            System.out.println(arr[s]+""+arr[i]);        }        fn(arr, length,s+1, p+1);    }}

方法二:

public class Zhuhe {    public static void main(String[] args) {        char[] a="ABCDE".toCharArray();        boolean[] x=new boolean[a.length];        fn(a,3,x,0);//在ABCDE中取出三个    }    private static void fn(char[] a, int sum, boolean[] x, int start) {        if(start==a.length){            if(sum==0){            for (int i = 0; i < x.length; i++) {                if(x[i]) System.out.print(a[i]+" ");            }            System.out.println();            }            return;        }        x[start]=true;        fn(a, sum-1, x, start+1);        x[start]=false;        fn(a, sum, x, start+1);    }}

谢谢查看,如何错误,欢迎指正!

原创粉丝点击