你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:抽签
X星球要派出一个5人的观察组前往W星球
其中
A国最多可以派出4人
B国最多可以派出2人
C国最多可以派出2人
......
那么最终派往W星球的观察团会有多少种国别的不同组合呢?
下面的程序解决了这个问题
数组a[]中即是每个国家可以派出的最多的名额
程序的执行结果为:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
(以下省略...共101行)
仔细阅读代码,填写划线部分缺少的内容
public class Year2016_Bt5 { public static void f(int [] a,int k,int n,String s) { if (k==a.length) { if(n == 0) System.out.println(s); return ; } String s2 = s; for (int i = 0; i <= a[k]; i++) { //___________________填空 s2 += (char)(k+'A'); } } public static void main(String[] args) { //分别是A B C D E F int []a = {4,2,2,1,1,3}; f(a, 0, 5, ""); } }
注意:请不要填写任何已有内容或说明文字。
解题思路:
本题在求解上就是采用了递归的思想,从第一个国家开始确定该国家可以派遣的人数,之后确定第二个国家,并且将每个国家派遣的人员通过字符串记录下来,直到确定最后一个国家派遣的人数(可以是0人),且缺少的人数是0的时候,就说明一个人组合完成了,这时输出组合方案即可。
答案源码:
public class Year2016_Bt5 { public static void f(int [] a,int k,int n,String s) { if (k==a.length) { if(n == 0) System.out.println(s); return ; } String s2 = s; for (int i = 0; i <= a[k]; i++) { f(a, k+1, n-i, s2);//___________________填空 s2 += (char)(k+'A'); } } public static void main(String[] args) { //分别是A B C D E F int []a = {4,2,2,1,1,3}; f(a, 0, 5, ""); } }
输出样例: