打靶
小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。
这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。
不同环数得分是这样设置的:
1,2,3,5,10,20,25,50
那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?
下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。
public class Main
{
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
{
if(ho<0 || bu<0 || sc<0) return;
if(k==ta.length){
if(ho>0 || bu>0 || sc>0) return;
for(int i=0; i<da.length; i++){
for(int j=0; j<da[i]; j++)
System.out.print(ta[i] + " ");
}
System.out.println();
return;
}
for(int i=0; i<=bu; i++){
da[k] = i;
f(ta, da, k+1, __________________ , bu-i, sc-ta[k]*i); // 填空位置
}
da[k] = 0;
}
public static void main(String[] args)
{
int[] ta = {1,2,3,5,10,20,25,50};
int[] da = new int[8];
f(ta, da, 0, 3, 6, 96);
}
}
注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。
f()的参数列表有点长,然而第一个数组显而易见,最后四个参数分别为0, 3, 6, 96。那么不出意外96应该为最后的分数,6为打了6发子弹,根据递归的方法,k应该为递归的层数,那么,就只剩ho和da[],根据题目描述,实在找不出多少个数字3(3个弹孔。六发子弹留了3个孔,6-3)。所以我暂时猜测ho为已有的弹孔数量,发现结果不对,再猜测ho为重复命中已有弹孔的次数,而da[]的长度为8,等于ta[]记录分数数组的长度,且方法中的两个循环输出只输出6个值,所以da[]中应该有的值为0;在这里也暂时猜测da记录ta中各个分数命中的次数。
那么就有填空的答案:
i<=1?ho:ho+1-i
运行下,输出
3 3 20 20 25 25
2 2 2 20 20 50
1 10 10 25 25 25
结果正确!
答案:
package 总决赛;
public class 打靶 {
// 设置的环数 0 3 6 96
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
// 3个弹孔 6发子弹
{
if(ho<0 || bu<0 || sc<0) return;
if(k==ta.length){//递归的层数
if(ho>0 || bu>0 || sc>0) return;
for(int i=0; i