代表团出访算法---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

浙公网安备 33010602011771号