1、引言
笔者在大学的算法竞赛中,遇到过这样的一个题目,现在拿出来与大家分享一下:现在有现有八枚银币abcdefgh,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。
2、分析
如果本题目只是很单纯的求解假币是哪一个,问题倒并不是很复杂,只需要回溯递归便可求得结果。问题的难点在意,我们需要用最少的步骤!!!
比之以前的数据结构问题,有递归,回溯,我们今天可能要接触一个新的概念,叫做树。顾名思义,数结构就是说我们的分析图示像树一样,有分支节点等各种信息。树结构是数据结构中的一个较大的章节,不在我们的讨论之中,在本题目当中,我们会介绍树的一个小小的分子,决策树。
我们先建立一下,八个银币求解的数学模型。一个简单的状况是这样的,我们将银币依次命名为abcdefg等,我们比较a+b+c与d+e+f,如果相等,则假币必是g或h,我们先比较g或h哪个较重,如果g较重,再与a比较(a是真币),如果g等于a,则g为真币,则h为假币,由于h比g轻而g是真币,则h假币的重量比真币轻。
如果不相等呢?又是何种情况,我们将依次分支回溯比较,直到得到最终的答案!
3、示例图
根据上面的分析,我们可以有一个完整的决策树图示:
4、代码
public class Coins { private int[] coins; public Coins() { coins = new int[8]; for(int i = 0; i < 8; i++) coins[i] = 10; } public void setFake(int weight) { coins[(int) (Math.random() * 7)] = weight; } public void fake() { if(coins[0]+coins[1]+coins[2] == coins[3]+coins[4]+coins[5]) { if(coins[6] > coins[7]) compare(6, 7, 0); else compare(7, 6, 0); } else if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(2, 5, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(0, 4, 1); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(1, 3, 0); } else if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(5, 2, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(3, 1, 0); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(4, 0, 1); } } protected void compare(int i, int j, int k) { if(coins[i] > coins[k]) System.out.print("\n假币 " + (i+1) + " 较重"); else System.out.print("\n假币 " + (j+1) + " 较轻"); } public static void main(String[] args) { if(args.length == 0) { System.out.println("输入假币重量(比10大或小)"); System.out.println("ex. java Coins 5"); return; } Coins eightCoins = new Coins(); eightCoins.setFake(Integer.parseInt(args[0])); eightCoins.fake(); } }
结果:
输入假币重量(比10大或小)
ex. java Coins 5
这里是一段通用的解题方法,大家可以仔细琢磨代码,对于本段代码,上面的分析已经足够,剩下的就要大家自己琢磨学习了,这样才能深刻理解。
总结
以上就是本文关于java编程实现求解八枚银币代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
本文向大家介绍java编程实现求质数与因式分解代码分享,包括了java编程实现求质数与因式分解代码分享的使用技巧和注意事项,需要的朋友参考一下 1、求解质数 1.1说明 首先,我们来了解这样一个概念,那就是什么叫做质数?质数:一个数如果只能被1和它自己整除,这样的数被称为质数,与之对应的,称为和数。基于这样的一个概念,我们可以很快想到一个方法,就是从1开始,不断试探,看从1到它自己,是否有数字能够
本文向大家介绍Java编程实现月食简单代码分享,包括了Java编程实现月食简单代码分享的使用技巧和注意事项,需要的朋友参考一下 用java的框架和面板的知识做的一个展示月食过程的小程序。这里的想法就是先把背景设置成黑色,然后画一个黄色的圆作为月亮,接着画一个黑色的圆,将它的y坐标与月亮相同,让这个x不断的自增,(这个x代表的是fillArc()里面的那个其实位置坐标)然后很关键的两个方法是slee
本文向大家介绍Java编程redisson实现分布式锁代码示例,包括了Java编程redisson实现分布式锁代码示例的使用技巧和注意事项,需要的朋友参考一下 最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关Redisson实现分布式锁的文章,好了,不多说了,直接进入主题。 1. 可重入锁(Reentrant Lock) Redisson的分布式可重入锁RLock Java对象实现
本文向大家介绍java编程实现优先队列的二叉堆代码分享,包括了java编程实现优先队列的二叉堆代码分享的使用技巧和注意事项,需要的朋友参考一下 这里主要介绍的是优先队列的二叉堆Java实现,代码如下: 总结 以上就是本文关于java编程实现优先队列的二叉堆代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:java集合中list的用法代码示例、Java编程接口调用的作用及代码分享
本文向大家介绍Java编程实现A*算法完整代码,包括了Java编程实现A*算法完整代码的使用技巧和注意事项,需要的朋友参考一下 前言 A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中 通过二维数组构建的一个迷宫,“%”表示墙壁,A为起点,B为终点,“#”代表障碍物,“*”代表算法计算后的路径 本文实例代码结构: 算法理论 算法的核心公式为:F=
本文向大家介绍Python实现线程池代码分享,包括了Python实现线程池代码分享的使用技巧和注意事项,需要的朋友参考一下 原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码