抽签
X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
....
那么最终派往W星的观察团会有多少种国别的不同组合呢?
下面的程序解决了这个问题。
数组a[] 中既是每个国家可以派出的最多的名额。
程序执行结果为:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,总共101行)
- package Lan2016;
-
- public class E抽签 {
- /*抽签
- X星球要派出一个5人组成的观察团前往W星。
- 其中:
- A国最多可以派出4人。
- B国最多可以派出2人。
- C国最多可以派出2人。
- ....
- 那么最终派往W星的观察团会有多少种国别的不同组合呢?
- 下面的程序解决了这个问题。
- 数组a[] 中既是每个国家可以派出的最多的名额。
- 程序执行结果为:
- DEFFF
- CEFFF
- CDFFF
- CDEFF
- CCFFF
- CCEFF
- CCDFF
- CCDEF
- BEFFF
- BDFFF
- BDEFF
- BCFFF
- BCEFF
- BCDFF
- BCDEF
- ....
- (以下省略,总共101行)*/
-
- /*
- * 不断尝试每个国家派出的人数范围
- * */
- public static void f(int[] a, int k, int n, String s)
- {
- if(k==a.length){//如果已经把每个国家的派出的人数范围已经遍历完
- if(n==0) System.out.println(s);//且人数达到5个
- return;//返回
- }
- String s2 = s;//定义新串保存之前的国别组合
- for(int i=0; i<=a[k]; i++){//遍历各国可派出的人数
- f(a,k+1,n-i,s2);//递归调用,判断下一个国家,这是人数剩n-i个
-
- s2 += (char)(k+'A');//将字母加到s2上
- }
- }
- public static void main(String[] args)
- {
- int[] a = {4,2,2,1,1,3};//数组,
- // A国最多可以派出4人,B国最多可以派出2人,C国最多可以派出2人,
- // D国最多可以派出1人,E国最多可以派出1人,F国最多可以派出3人。
-
- f(a,0,5,"");//
- }
-
- }
要考虑到用递归,k表示遍历的国别数,当一个国家遍历完之后,则要判断下一个国家,此时需要遍历的人数n也会-1