找出伪币问题
来源:互联网 发布:python get(,0) 编辑:程序博客网 时间:2024/05/22 13:16
简介
找出伪币问题利用递归与分治算法实现
题目:
装有1 6个硬币的袋子。1 6个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。我们要找出这个伪造的硬币。我们有一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同.
解决思路:
将16个硬币分为A,B两堆,进行比较。如果A堆轻的话,在从A堆中分为AA,AB两堆进行比较。知道找出伪币为止。
public class App { public static void main( String[] args ) { int[] arr = new int[16]; arr[0]=2; arr[1]=2; arr[2]=2; arr[3]=2; arr[4]=2; arr[5]=2; arr[6]=2; arr[7]=2; arr[8]=2; arr[9]=1; arr[10]=2; arr[11]=2; arr[12]=2; arr[13]=2; arr[14]=2; arr[15]=2; System.out.println(BinarySearch(arr,0,15)); } /** * 递归与分治算法----找出伪币问题 * @param arr 伪币数组 * @param from 起始位置 * @param to 截止位置 * @return 伪币下标 -1 为没有伪币 */ public static int BinarySearch(int[] arr,int from,int to){ int result = -1; //step 1 如果检查到最后两个元素 设置递归出口 if(from+1==to){ result = arr[from]-arr[to]>0?to:from; }else{ //step 2 如果检查多个元素2*n 设置递归 //起始终点下标 int fromMax = (from+to-1)/2; //截止起点下标 int toMin = (from+to+1)/2; //起始元素总和 int sumFrom = 0; //截止元素总和 int sumTo = 0; for(int i=from;i<=fromMax;i++){ sumFrom = sumFrom+arr[i]; } for(int j=toMin;j<=to;j++){ sumTo = sumTo+arr[j]; } //如果 总和相等 返回 -1 未查到 if(sumFrom ==sumTo){ return result; } // 如果不相等,小的总和 进行递归 result = sumFrom-sumTo>0?BinarySearch(arr,toMin,to):BinarySearch(arr,from,fromMax); } return result; }}
阅读全文
0 0
- 找出伪币问题
- 伪币问题
- 伪币识别问题
- 分冶算法实例—找出伪币
- 利用分治算法——在真币中找出伪币
- 分治算法——在真币中找出伪币
- 使用天平找伪币
- oracle 找出问题sql
- 03 找出性能问题
- 问题 : 找出直系亲属
- 找出可能发生问题的地方
- 找出最近的2个薪资问题
- 找出存在性能问题的sql语句
- 钱币兑换问题( 找出公式即可 )
- 找出最大K个数,TopK问题
- 找出一堆数据中最小的K个数问题
- Windbg 分析 Dump File 找出高cpu及内存问题
- 找出复杂问题中隐含的递归结构
- IntelliJ IDEA Maven Gradle的配置
- ubuntu16.04 编译 opencv3.1.0 (Anaconda)
- Java基础知识第三篇-常用类、库
- 日历插件和富文本框
- 前端面试知识点总结
- 找出伪币问题
- [日推荐]『TheGolfGame』一个高端大气上档次的小程序
- WPF中DataGrid的应用
- UIAlerController 优化
- Arcgis for Android多版本中文字体乱码解决方案
- 数据的4种存储方式
- Java基础知识第四篇-线程
- 读《暗时间》笔记
- MySQL数据导入异常问题