题目:

打靶

小明参加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

for(int j=0; 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);

}

}注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

本题结论有待验证,证明后更改,主要纠结于3代表总共三个弹孔,还是三次重复穿过弹孔

如果代表总共三个弹孔  答案:i > 0  ? ho - 1: ho

如果代表总共三次重复穿过:答案:i > 1 ? ho - (i - 1) : ho

分析:

1.main函数分析:

public static void main(String[] args) {

int[] ta = { 1, 2, 3, 5, 10, 20, 25, 50 };//记录分值

int[] da = new int[8];//记录每个分值的个数

f(ta, da, k,ho,bu, sc);

f(ta, da, 0, 3, 6, 96);//第一二个参数不用解释,从ta第0位开始枚举,3个重复弹孔,上限6个分数,共96分

}

2.递归函数分析:

static void f(int[] ta, int[] da, int k, int ho, int bu, int sc) {

if (ho < 0 || bu < 0 || sc < 0)//最后ho bu sc 都大于0 才有递归的必要(剪枝)

return;

if (k == ta.length) {// 当k枚举完ta数组(类似for循环的i),开始判断

if (ho > 0 || bu > 0 || sc > 0)// 三个参数都等于0,说明递归过程会把已经枚举的值扣除相应的ho,bu,sc值

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++) {//bu是分数个数的上限

da[k] = i;//每一个分值从0~bu(即6)进行深搜枚举

f(ta, da, k + 1, i > 1 ? ho - (i - 1) : ho, bu - i, sc - ta[k] * i); // 填空位置

}

/*刚开始直接填0,发现每个答案加起来就是96,唯一不同的就是,有的弹孔数不是3个

*可见,ho的值就是用来筛选的且要扣除有几个重复的,由da数组可知每个分值是记录每个分值个数的

*所以我推出ho,当分值的个数大于1,只要减去每个分值的个数扣掉1之后的值(即重复的数量),如da[1] = 3,那么我就ho扣掉2

*最后运行,果然,得出了三组数据且只有三个弹孔,完美解决

* */

da[k] = 0;//分值每种情况枚举完之后要回溯,清零

}

把ho填0,得出的结果:

推出代码后结果:

所以应该填入:i > 1 ? ho - (i - 1) : ho

完整代码:

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, i > 1 ? ho - (i - 1) : ho, 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, k,ho,bu, sc);

f(ta, da, 0, 3, 6, 96);

}

}

总结:

主要还是考深搜还有回溯,跟全排列有点像,类似全排列的进阶

java蓝桥杯dfs_第七届 蓝桥杯决赛 Java B组 打靶 解题报告(DFS,回溯,全排列)-Go语言中文社区...相关推荐

  1. 2016蓝桥杯java试题_2016年第七届蓝桥杯JavaB组省赛试题解析

    题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题.第七题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第八题到第十题是编程题,要求编程 ...

  2. 蓝桥杯java生成树计数_第七届蓝桥杯决赛杂记

    反正最近不想干什么正经事,回忆一下这些东西也好. 总的来说,这是我第二次去北京参加蓝桥杯决赛.去年获得了优秀奖,换句话来说就是重在参与.不过,今年成绩比去年好一点. (订的宾馆一如既往的温馨就不说了) ...

  3. java比赛题目_【蓝桥杯2016第七届比赛题目】JAVA A组

    1 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...

  4. java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)

    第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...

  5. 2016蓝桥杯b组java试题及答案_2016年第七届蓝桥杯java B组省赛试题

    2016年第七届蓝桥杯java B组省赛试题 1-3.结果填空 4-5.代码填空 6-7.结果填空 8-10.程序设计 1.煤球数目  (结果填空) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, ...

  6. java中的冰雹数,java实现第七届蓝桥杯打印数字

    打印数字 打印数字 小明写了一个有趣的程序,给定一串数字. 它可以输出这串数字拼出放大的自己的样子. 比如"2016"会输出为: 00000 1 6666 2 0 0 1 1 6 ...

  7. 第七届蓝桥杯 java组有奖竞猜

    第七届蓝桥杯 有奖猜谜 有奖猜谜 小明很喜欢猜谜语. 最近,他被邀请参加了X星球的猜谜活动. 每位选手开始的时候都被发给777个电子币. 规则是:猜对了,手里的电子币数目翻倍, 猜错了,扣除555个电 ...

  8. 2016年第七届蓝桥杯真题解析JavaC组

    相关题目: 2016年第七届蓝桥杯真题解析JavaB组 2016年第七届蓝桥杯真题解析JavaC组 2017年第八届蓝桥杯真题解析JavaB组 2017年第八届蓝桥杯真题解析JavaC组 2018年第 ...

  9. 蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)

    第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球 ...

最新文章

  1. 彻底搞懂MySQL分区
  2. mysql创建数据库选择_mysql创建、选择并使用数据库
  3. 手机号正则_这20个正则表达式,对你有大帮助,快来Make
  4. python合并txt文本_Python实现将目录中TXT合并成一个大TXT文件的方法
  5. java:拷贝文件(夹)
  6. 判断应用程序在前台还是后台
  7. Memcached概述
  8. laravel基本信息
  9. AngularJS Eclipse——新手入门【翻译+整理】
  10. Ubuntu下安装uwsgi报错的解决方案
  11. 50: 加密与解密 、 AIDE入侵检测系统 、 扫描与抓包 、 总结和答疑
  12. python游戏编程之环境配置
  13. 2018年总——不忘初心
  14. 小米手机Home键问题
  15. 如何完全卸载oracle
  16. CV_8U CV_32F, and CV_32S
  17. 计组 - 加法器:进位链
  18. 小红书商品详情API接口(item_get-获得小红书商品详情接口)
  19. 赶集网CDC案例-蔡峰:赶集网CDC异构数据同步方案实践-IT168 信息化专区
  20. 学习Surging笔记(总记)

热门文章

  1. 豪投10亿!华为放话:3年培养100万AI人才!网友神回应了
  2. 强推!盘点阿里巴巴 15 款开发者工具 | 程序员硬核评测
  3. android init.d脚本,◇添加init.d脚本支持教程贴◇
  4. 华为鸿蒙系统p40,华为鸿蒙OS系统正式亮剑!华为P40再次确认:双打孔+麒麟990+鸿蒙OS...
  5. c语言 cstring “+”: 运算符不起任何作用;应输入带副作用的运算符_国家计算机二级考试C语言选择题高频考点汇总,干货满满...
  6. RabbitMQ开机启动 Centos7环境
  7. Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目
  8. ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.1.165‘ (113)
  9. 设置线程当天十二点执行_这份JAVA多线程笔记真的是细节满满,几乎全是你工作能用到的干货...
  10. python 两个数据框合并计算_一文掌握Excel、SQL、Python【数据合并】大法!