分治算法的经典例题,假币问题

这是一篇关于使用分治算法解决经典问题——找出一个轻于其他硬币的伪造硬币的文章。通过将硬币分为两组进行比较,逐步缩小假币范围,无论硬币数量为奇数或偶数,都能有效找到目标。作者强调了算法学习的重要性以及良好的代码风格习惯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每周都有几道算法题啦。

第一周

是分治算法一道比较经典的例题,题目如下:有16个硬币的袋子。16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。我们要找出这个伪造的硬币。我们有一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。

如果数目较少,我们可以采用逐个比较的方法,寻找出假币的位置。但这是算法题啊喂,暴力解题算个什么鬼2333,还是采用分治的方法解决。

分治算法在我的理解内,就是将比较大的问题分成比较小的,相互独立的子问题,即N=n+n+……+n,采用递归方法解决。emmmm,还要继续看书。

public class FakeCoins {
    public static void main(String args[]) {
        int[] coins = new int[]{2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
        int index = fakeCoins(coins, 0, 15) + 1;
        //System.out.println(index);
        System.out.println("16枚硬币中第" + index + "枚是假币");
    }
    public static int fakeCoins(int[] coins,int low,int high){
        int sum1 = 0,sum2 = 0,re = 0;
        if((high-low+1) % 2 == 0){              //如果总个数为偶数
            //前半段之和
            for(int x = low;x <= low + (high - low) / 2;x++){
                sum1 += coins[x];
            }
            //后半段之和
            for(int x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值