题目描述
小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。
这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。
不同环数得分是这样设置的:
1,2,3,5,10,20,25,50
那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?
下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。
// 答案:ho - (i == 0 ? 0 : 1) public class Mian { /* * ta:代表不同环数的得分 * da:da[i],代表在第i环上打了da[i]枪 * k:表示接下来打来讨论第k环打了多少次 * ho:表示目前还剩下几个孔没讨论 * bu:表示目前打了6-bu枪,即还能打机枪 * sc:表示目前已经打了96-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; // 如果第ta[i]换不打,即i=0,则讨论下一枪的情况时,还有ho个孔没打;若i!=0,则讨论下一枪的情况时,有ho-1个孔还没打。 f(ta, da, k + 1, ho - (i == 0 ? 0 : 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); } }