Java的组合排列问题

 

从4个人中选2个人参加活动,一共有6种选法。 从n个人中选m个人参加活动,一共有多少种选法?C(m/n)=C((m-1)/(n-1))+C(m/(n-1))数学算法

public class Main {
    public static void main(String[] args) {
        System.out.println("请输入总人数:");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println("请输入选择人数:");
        int m=sc.nextInt();
        System.out.println("一共有"+fun(n,m)+"种方法!");
    }  
    private static int fun(int n, int m) {     
        if(m>n)return 0;    
        if(m==0)return 1;      
        return fun(n-1,m-1) + fun(n-1,m);
    }
}

2.

计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域 

。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。 

下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。 

A(n/m)=A(n/(m-1))+A((n-1)/m)

 

方法一:

public class Main {
    public static void main(String[] args) {
        int m=3;
        int n=2;
        System.out.println(pailie(m, n));
    }
    public static int pailie(int m,int n){ 
        if (m==0||n==0)return 1;   
        return pailie(m-1,n)+pailie(m, n-1);
    }
}

方法二:

public class Main {
    public static void main(String[] args) {
        char[] date="ABC".toCharArray();
        f(date,0);
    }
    private static void f(char[] date, int k) {
        if (k==date.length) {
            for (int i = 0; i < date.length; i++) {
                System.out.print(date[i]+" ");
            }
            System.out.println();
        }  
        for (int i = k; i < date.length; i++) {
            {char t=date[k];date[k]=date[i];date[i]=t;}//试探    
            f(date,k+1);       
            {char t=date[k];date[k]=date[i];date[i]=t;}//回溯
        }  
    }
}

 

 

 

原文链接:http://www.cnblogs.com/cy666/ 

posted @ 2018-07-26 10:23  小沐CA  阅读(222)  评论(0)    收藏  举报