分治解决假硬币问题

原创 2017年01月03日 17:15:42
package testing_03;

import java.util.Scanner;

/*
 *假硬币问题
 * high,low,n; 
 * */

public class test_13 {
    //static final int MAXNUM=30;
    static int FalseCoin(int coin[],int low,int high){
        int i,sum1,sum2,sum3;
        int re=0;
        sum1=sum2=sum3=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){
            for(i=low;i<low+(high-low)/2;i++){
                sum1=sum1+coin[i];
            }
            for(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;
            }
            if(sum1<sum2){
                re=FalseCoin(coin,low,low+(high-low)/2);
                return re;
            }
            else{}
        }
        else{
            for(i=low;i<=low+(high-low)/2-1;i++){
                sum1=sum1+coin[i];
            }
            for(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(sum1<sum2){
                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) {
        // TODO Auto-generated method stub

        System.out.println("分治算法求解假硬币问题");
        System.out.println("请输入硬币的总数:");
        Scanner input=new Scanner(System.in);
       int  n=input.nextInt();
        int [] coin=new int[n];
        int i;
        int weizhi;
        System.out.println("请输入硬币的真假:");
        for(i=0;i<n;i++){
            coin[i]=input.nextInt();
        }
        weizhi=FalseCoin(coin,0,n-1);
        System.out.println("在上述"+n+"中"+"第"+weizhi+"是假币");
    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

最少硬币问题(动态规划解决)

设有n中不同面值的硬币,各硬币的面值存在于数组T[1..n]中,可以使用的面值硬币个数不限。假如现在找的钱是j,1 解决方法: 另c[i,j]代表用前中硬币兑换j所用的最少数目。#include ...

练习使用Java的BigInteger解决矩阵翻硬币问题

题目是蓝桥杯的某届真题,叫做矩阵翻硬币 问题描述   小明先把硬币摆成了一个 n 行 m 列的矩阵。   随后,小明对每一个硬币分别进行一次 Q 操作。   对第x行第y列的硬币进行 ...

硬币找钱问题,求所有可能解决方案数目,最少的钱币数目,每种钱币用多少张

【题目简介】 现存在一堆面值为 V1、V2、V3 … 个单位的硬币,一共有多少种找钱方法可以找出总值为 T 个单位的零钱?最少需要多少张钱币?在最少钱币数目找钱的条件下,每种钱币使用的次数是多少?假设...

背包解决硬币问题专题

link:http://acm.hdu.edu.cn/showproblem.php?pid=1284 钱币兑换问题 Time Limit: 2000/1000 MS (Java/Othe...

8枚硬币问题

  • 2014-04-16 11:04
  • 158KB
  • 下载

硬币组合问题

题目假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n。例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 + ...

最小硬币问题的c语言代码

  • 2008-11-06 16:08
  • 1.01MB
  • 下载

EM算法源码C++硬币问题

  • 2015-12-08 14:29
  • 1.61MB
  • 下载

贪心算法求解硬币问题的递归与非递归实现

package com.wentora.exercise; /** * 贪心算法求解找硬币问题 * 假定:硬币的面值由大到小顺序输入 * 如果不是,则需要排序即可 * 递归求解 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)