`
bcyy
  • 浏览: 1818027 次
文章分类
社区版块
存档分类
最新评论

算法设计--八枚硬币问题

 
阅读更多

八枚硬币问题

问题描述:

在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。



解决思路:

假定输入的八枚硬币:a、b、c、d、e、f、g、h

实验解决思路:把硬币分成三组,从八枚硬币中任取六枚a、b、c、d、e、f,在天平两端各放三枚进行比较。 假设a、b、c三枚放在天平的一端,d、e、f三枚放在天平的另一端,可能出现如图所示的三种比较结果。

实验步骤:

1.将硬币分为3组:a,b,c、d,e,f、g,h,


2.分别取a,b,c、d,e,f 放在天平的两侧,现在假设硬币abc重于def,这说明这两组中有一组包含一枚假币,但不确定是在左侧,还是右侧。

3.由上面的我们已经知道假币在前面两组了,那么剩下的那组的两枚硬币应该是相等的,我们取其中一枚作为考量值,这里取g硬币。取左侧的一枚硬币:a硬币,再取右侧的一枚硬币:e硬币,把ae作为新左侧的硬币组合,再取右侧的一枚硬币:d硬币+考量值:g硬币作为新右侧组合。如果出现重量不等,则可确定:这两组中的一组存在一枚假币,但具体是哪一枚还没有确定。

4.我们可以通过把a、e、d分别于h比较,假如与h不一样,则这枚硬币为假币,并且可以确定这枚假币是重还是轻。整个解决思路就是这样。


5.最后结果e与h比较,e不等于h重量,并且较轻,e为最终结果。



代码实现:

#include<iostream>
using namespace std;

//函数声明
void eightcoin(int arr[]);
void compare(int a, int b,int real, int index1,int index2);
void print(int jia, int zhen, int i);

int main()
{
	int i = 0;
	int arr[8];
	//这里输入a、b、c、d、e、f、g、h的重量
	cout<<"请输入八枚硬币:"<<endl;
	for(i; i < 8; i++)
	{
		cin>>arr[i];
	}
	eightcoin(arr);

	system("pause");
	return 0;
}
/**
*  八枚硬币问题描述:
*,有一枚是假币,并且已知假币与真币的重量不同
*,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币
*,设计一个高效的算法来检测出这枚假币
* @date:2013/4/27
* @author:wwj
*/
void eightcoin(int arr[])
{
	//1. 取数组中的前6个元素分为两组进行比较abc,def
	//会有a+b+c > d+e+f | a+b+c == d+e+f | a+b+c < d+e+f 三种情况
	int abc = arr[0] + arr[1] + arr[2];
	int def = arr[3] + arr[4] + arr[5];
	int a = arr[0];
	int b = arr[1];
	int c = arr[2];
	int d = arr[3];
	int e = arr[4];
	int f = arr[5];
	int g = arr[6];
	int h = arr[7];
	if(abc > def)		//6枚硬币必有一枚假币,g,h为真币
	{
		if((a + e) > (d + b))	//去掉c,f,且b,e互换后,没有引起天平变化,说明假币必然是a,d中的一个
		{
			compare(a, d, g,1,3);
			
		}
		else if((a + e) == (d + b))
		{
			compare(c,f,g,2,5);
		}
		else
		{
			compare(b,e,g,1,4);
		}
	}
	else if(abc == def)	//假币在g,h之中,最好状态
	{
		
		if(g == a)
		{
			print(h,g,7);
		} 
		else
		{
			print(g,h, 6);
		}

	}
	else				//abc < def 这两组存在一枚假币,g,h为真币
	{
		if((a + e) > (d + b))
		{
			compare(b,e,g,1,4);
		}
		else if((a + e) == (d + b))
		{
			compare(c,f,g,2,5);
		}
		else
		{
			compare(a, d, g,1,3);
		}
	}

}
/**
* 取出可能有一枚假币的两枚假币,作为参数a和参数b
* real表示真币的重量,index1为第一枚硬币的下标,index2为第二枚硬币的下标
*/
void compare(int a, int b,int real, int index1,int index2)
{
	if(a == real)
	{
		print(b,real,index2);
	}
	else
	{
		print(a, real,index1);
	}
}

void print(int jia, int zhen, int i)
{
	if(jia > zhen)
	{
		cout<<"位置在:"<<(i + 1)<<"是假币!"<<"且偏重!";
	}
	else {
		cout<<"位置在:"<<(i + 1)<<"是假币!"<<"且偏轻!";
	}
}


验证结果:





分享到:
评论

相关推荐

    算法设计--八枚硬币问题.rar

    算法设计--八枚硬币问题.rar

    算法设计--动态规划之硬币付款问题

    设有n种不同面值的硬币,第i种硬币的币值是vk(其中v1=1),重量是wi,i=1,2……n,且现在购买某些总价值为y的商品,需要用这些硬币付款,如果每种钱币使用的个数不限,那么如何选择付款的方法是的付出钱币的总重量最轻?

    算法分析 运用减至法解决八枚硬币问题

    算法分析 八枚硬币问题C语言源程序 在八枚外观相同的硬币中,有一枚是假的,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这...

    减治法解八枚硬币问题

    这是我自己写的减治法解八枚硬币问题的程序,需要的同学可以看看

    算法分析实验 找零钱问题 伪造硬币问题

    1. 【伪造硬币问题】给你一个装有n个硬币的袋子。n个硬币中有一个是伪造的。你的任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的...

    八枚硬币问题

    八枚硬币问题 问题描述: 在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。

    硬币找钱---算法设计

    硬币找钱算法设计硬币找钱算法设计 硬币找钱算法设计硬币找钱算法设计 硬币找钱算法设计硬币找钱算法设计 用C++编写的一个硬币找钱算法。

    减治法八枚硬币问题

    减治法八枚硬币问题

    最少硬币问题 动态规划

    最少硬币问题 动态规划动态规划动态规划动态规划动态规划v

    算法设计与分析-最少硬币问题

    对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。 对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。 Input 每组测试...

    算法设计 硬币找零 原代码

    算法设计 硬币找零 程序 算法设计 硬币找零 程序 算法设计 硬币找零 程序 算法设计 硬币找零 程序

    8枚硬币问题

    算法设计与分析中的吧8枚硬币问题 很实用 很好 赶紧下载吧

    [C/算法]N硬币问题/称硬币

    N枚硬币中,有一枚是假币,并且已知假币与真币重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。

    归纳算法程序设计(硬币翻转问题)

    这是属于归纳算法的程序设计,以经典的硬币翻转问题,希望能给他人带来一些借鉴和帮助 谢谢

    ConsoleApplication20_算法设计与分析之动态规划求解硬币问题_

    算法设计与分析作业:动态规划———硬币问题源码

    算法分析与设计-假币问题

    个人设计编写的算法分析与设计中的假币问题,其中用到分治策略。采用三分法。

    动态规划-最少硬币问题

    算法设计-动态规划法解决最少硬币问题源代码

    算法分析与设计 最少硬币问题

    使用各种面值的硬币,现用这些硬币找钱 对任意钱数,用最少钱币找钱的方法

    n枚硬币中假币问题

    在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币

    c语言分治法硬币算法

    在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币。

Global site tag (gtag.js) - Google Analytics