题目:
小明参加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); } }
思路:
public class Main { /*ta里面存放环数分值,da里面存放每个分支各打了多少次,ho记录还剩多少个单孔没打,k记录是否遍历 完ta,bu记录还剩多少颗子弹,sc记录还剩多少分没打*/ static void f(int[] ta, int[] da, int k, int ho, int bu, int sc) { if(ho<0 || bu<0 || sc<0) return;//ho、bu和sc不可能小于0,错误情况 if(k==ta.length){//遍历完ta时 if(ho>0 || bu>0 || sc>0) return;/*遍历完ta时,如果此时ho、bu和sc任何一个仍然大于 0,说明未达到条件*/ 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;//记录得到ta[k]分数的次数 f(ta, da, k+1, ho - (i == 0 ? 0 : 1) , bu-i, sc-ta[k]*i); /*如果i==0,没有新增 弹孔,否则i==1,==2,==3...都会并且仅会增加一个 */ } 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); } }