代表团出访算法---Java

问题描述

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
D国最多可以派出1人。
E国最多可以派出1人。
F国最多可以派出3人。
那么最终派往W星的观察团会有多少种国别的不同组合呢?

解决思路

    通过分析可知该问题可以等价为:从"AAAABBCCDEFFF"串中抽取五个字符,共可以有多少种不同的组合。此时可以将出现的每个不同的字符个数用一个数组data={4,2,2,1,1,3}来表示出来。然后设置一个数组x用于存储每个不同字符的所取个数。然后通过构造一个递归函数来不断的测试x[k]的取值。具体代码如下:

算法如下

//"AAAABBCCDEFFF"取5个有哪些取法
public class zuhechong {
    private static int N = 0;//存储有多少种组合
    public static void work(int[] x){
        for (int i = 0; i < x.length; i++) {
            for (int j = 0; j < x[i]; j++) {
                System.out.print((char)('A' + i));
            }
        }
        N++;
        System.out.println();
    }
    //data:不动,限制条件
    //x:取法
    //k:当前位置
    //goal:距离目标的剩余名额
    public static void f(int[] data,int[] x,int k,int goal){

        if(k == data.length){
            if(goal==0){
                work(x);
            }
            return;
        }
        for (int i = 0; i <= Math.min(data[k],goal) ; i++) {
            x[k] = i;
            f(data,x,k+1,goal-i);
        }

        x[k] = 0;//回溯
    }
    public static void main(String[] args) {
        int[] data = {4,2,2,1,1,3};//每个元素的最大个数
        int[] x = new int[data.length];//存储每个元素取几个
        f(data,x,0,5);
        System.out.println("N = " + N);
    }
}

程序运行结果:

N = 101
Process finished with exit code 0

posted @ 2020-03-02 16:36  Alex-jzw  阅读(204)  评论(0)    收藏  举报