您的位置:首页 > 编程语言 > Java开发

【蓝桥杯】2016年第七届蓝桥杯省赛真题-Java语言B组-5-抽签

2019-03-20 19:40 281 查看

抽签

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 class A
{
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)
{
int[] a = {4,2,2,1,1,3};

f(a,0,5,"");
}
}

仔细阅读代码,填写划线部分缺少的内容。

注意:不要填写任何已有内容或说明性文字。

分析:
由于本题要求到几个国家派出的人员的组合方案,是一个排列组合问题,而且,代码中的

if(k==a.length){ 			if(n==0) System.out.println(s); 			return; 		}
这部分相当于是一个出口,我们不难发现这是用递归方法实现的。
所给出的代码中并没有递归调用的部分,所以补充的代码应该是递归调用的函数。

既然这样,我们就有必要弄清楚递归函数f(int[] a, int k, int n, String s)中每个参数的具体含义。

a: 数组a每个国家可以派出的最多的名额
k :排定第k个元素
n :代表人数,初始为5
s :组合方案字符串

所以很明显,第一个参数还是a,将数组传进来;第二个参数应该是k+1,用于排定下一个元素;第三个参数,经过for循环之后已经尝试着派出i人了,所以剩余的人数应该是n-i;第四个参数,传一个字符串,for循环上面刚定义了s2,for循环中的字符串是s2,我们可以试着将s2传进去试试。

另外可以定义一个变量cnt,用于计数,在递归出口处自增,检验答案是否正确,是否是题目中所说的会输出101行。

答案:f(a, k+1, n-i, s2)

可执行代码:

public class Main {
/* 参数的含义:
* a 数组a每个国家可以派出的最多的名额
* k 排定第k个元素
* n 代表人数,初始为5
* s 字符串
*/

static int cnt;//用于计数,检验答案是否正确
public static void f(int[] a, int k, int n, String s)
{
if(k==a.length){
if(n==0) {
System.out.println(s);
cnt++;
}
return;
}

String s2 = s;
for(int i=0; i<=a[k]; i++){				//试着将k国家派出i人
//_____________________________;   //填空位置
f(a, k+1, n-i, s2);//填空位置
s2 += (char)(k+'A');
}
}

public static void main(String[] args)
{
int[] a = {4,2,2,1,1,3};		//数组a[] 中即是每个国家可以派出的最多的名额。

f(a,0,5,"");
System.out.println(cnt);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: