分治算法解决硬币轻重问题
2018-03-07 14:10
232 查看
带子里面有若干个硬币 其中一枚是假币,并且假币和真币一模一样 肉眼很难分辨 目前只知道假币比真币的重量轻 请问如何分出真假币
import java.util.Scanner;public class Demo04 {
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;
}
else 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) {
int [] coin =new int [MAXNUM];
int i,n;
int weizhi;
System.out.println("分治算法解决假币问题!");
System.out.println("请输入硬币总的个数:");
Scanner in =new Scanner(System.in);
n=in.nextInt();
System.out.println("请输入硬币的真假:");
for(i=0;i<n;i++)
{
coin[i]=in.nextInt();
}
weizhi=FalseCoin(coin, 0, n-1);
System.out.println("在上述"+MAXNUM+"个硬币中,第"+weizhi+"个硬币是假的!");
}
}
正硬币为2假硬币为1;
相关文章推荐
- 分治算法思想解决找假硬币的问题
- 分治算法——假硬币寻找,硬币找零,众数问题
- 硬币找零问题,力求解决一些一切可能的办法,硬币的最小数量,有多少每个硬币的
- 用“分治算法”解决“放苹果问题”
- “分治算法”解决“放苹果问题”
- 数学方法解决翻硬币问题
- 动态规划解决硬币问题
- 分治解决假硬币问题
- 减治法解决八枚硬币问题/假币问题(JAVA)----二分,三分,不知轻重的情况
- 程序设计:贪心算法解决硬币问题
- 最少硬币问题(动态规划解决)
- 练习使用Java的BigInteger解决矩阵翻硬币问题
- 编写C++风格的程序,解决百钱问题,将1元人民币兑换成1,2,5分的硬币,有多少种换法
- 贪心法解决硬币问题
- 冯诺依曼解决的一个抛硬币问题
- C++,贪婪法解决硬币找零问题
- 【数据结构】分治算法求解假硬币问题
- c++动态规划解决硬币换零钱的问题
- 分治算法思想解决找假硬币的问题
- 背包解决硬币问题专题