打靶
小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。
这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。
不同环数得分是这样设置的:
1,2,3,5,10,20,25,50
那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?
下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。
package dibajie; public class no3 { /** * * @param ta 分数 * @param da 目标数组 * @param k 当前在数组中是第几个位置 * @param ho 几个弹孔 * @param bu打了几发 * * @param sc分数 */ 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, ho-(i == 0 ? 0 : 1) , bu-i, sc-ta[k]*i); // 填空位置 //先根据题意判断出各个参数的含义,ho代表弹孔余量,此处的递归即是根据i(打了几枪),判断还剩下几个弹孔需要试探。 //当i=0时,ho不变,即ho-0;否则ho-1,因为每打出一枪,还需计算的 弹孔的个数就应该少一个。 } 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); } }