分治算法经典例题 寻找假币

来源:互联网 发布:js涂料 编辑:程序博客网 时间:2024/05/18 04:03

一个袋子里有若干硬币,其中一枚是假币,并且和假币和真币一模一样,目前只知道假币币真币轻一点。请问如何区别:

利用分治 算法的思想:

import java.util.Scanner;public class Main {    static final int MAXNUM = 30;    private static int FalseCoin(int[] coin, int low, int high) {        int sum1 = 0, sum2 = 0, sum3 = 0;        int re = 0;        if ( low+1 == high ) {            if ( coin[low] < coin[high] ) {                re = low+1;                return re;            }            else {                re = high+1;                return re;            }        }        if ( (high-low+1)%2 == 0 ) {//如果n是偶数            //前半段            for ( int i = low; i <= low+(high-low)/2; i++ ) {                sum1 = sum1 + coin[i];            }            //后半段            for ( int i = low+(high-low)/2+1; i <= high; i++ ) {                sum2 = sum2 + coin[i];            }            if ( sum1 > sum2 ) {                re = FalseCoin(coin, low+(high-low)/2+1, high);                return re;            }            else if ( sum2 > sum1 ){//sum2 > sum1                re = FalseCoin(coin, low, low+(high-low)/2);                return re;            }            else {            }        }        else {//如果是奇数            //前半段,除去中间的一个硬币            for ( int i = low; i <= low+(high-low)/2-1; i++ ) {                sum1 = sum1 + coin[i];            }            //后半段,除去中间的一个硬币            for ( int i = low+(high-low)/2+1; i <= high;i++ ) {                sum2 = sum2 + coin[i];            }            sum3 = coin[low+(high-low)/2];            if ( sum1 > sum2 ) {                re = FalseCoin(coin, low+(high-low)/2+1, high);                return re;            }            else if ( sum2 > sum1 ){                re = FalseCoin(coin, low, low+(high-low)/2-1);                return re;            }            else {            }            if ( sum1+sum3 == sum2+sum3 ) {                re = low+(high-low)/2+1;                return re;            }        }        return re;    }    public static void main(String[] args) {        int[] coin = new int[MAXNUM];        System.out.println("分治算法求假币问题: ");        System.out.println("请输入硬币总的个数: ");        Scanner in = new Scanner(System.in);        int n = in.nextInt();        System.out.println("请输入所有硬币权值: ");        for ( int i = 0; i < n; i++ ) {            coin[i] = in.nextInt();        }        int position = FalseCoin(coin, 0, n-1);        System.out.println("假币在 " + position + "个位置 ");    }   }

//其实 本例子只是为了理解分治算法的思想,要是找出那一枚硬币,在规模小的情况下,一个个称 比一下不就好了。

分治算法的基本思想

对于一个规模为N的问题,若该规模比较难解决,
可以分解为M个小规模的子问题,相互独立的子问题。
可以采用递归算法进行解决。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 游戏倒闭冲的钱怎么办 一闭眼就做噩梦怎么办 吃鸡游戏上瘾了怎么办 使命召唤7很卡怎么办 w10升级系统卡死怎么办 答题卡写错位置怎么办 高考答错区域该怎么办 荒野行动画面中间有条横怎么办 荒野行动pc闪退怎么办 幽灵行动荒野子弹没了怎么办 看门狗2枪没子弹怎么办 爱奇艺不小心删除了本地视频怎么办 80岁老太太就爱闹肚子怎么办? 皇牌空战5弹药不够怎么办 辐射4玩着头晕怎么办 官司打赢了法院不给钱怎么办 电脑玩dnf太卡怎么办 soul被禁止私聊怎么办 刺激战场空投挂树上怎么办 由于经济原因心态不好怎么办 公司经济不好不裁员怎么办 家里经济不好没有钱怎么办 银行柜员找不到工作怎么办 在球队中打替补怎么办 大学生毕业后找不到工作怎么办 30岁不敢换工作怎么办 投完简历没回复怎么办 工业废气一年总量超标怎么办 安监局行政处罚没能力交怎么办 被社会淘汰的人怎么办 宝宝吐奶的时候怎么办 网友要我发红包怎么办 电脑久了很慢怎么办 影驰显卡花屏怎么办 反恐精英全球攻势加载地图慢怎么办 老滚5视角锁死了怎么办 苹果描述文件没有了怎么办 苹果6s发热严重怎么办 苹果6s发烫严重怎么办 手机型号不适配全军出击怎么办? 苹果5版本过低怎么办