【每日蓝桥】38、一六年省赛Java组真题“抽签”

你好呀,我是灰小猿,一个超会写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, "");
	}

}

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/115031688