找出伪币问题

来源:互联网 发布: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;    }}


原创粉丝点击