现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。
分析:可以先取出a,b,c和d,e,f进行比较,如果两者的重量相等,即说明假币在g,h,再分别取出g,h和a(确认为真币)比较,和a不相等的是假币,如果两者重量不一样,即说明g,h是真币,然后取出c和f,比较sum(a,b)和sum(d,e),如果两者相等即说明假币在(c,f),如果不相等,则继续取出银币,直到找到假币为止。
其关系像决策树:
在继续进行判断的情况可以使用递归,当然一直把情况列出来也能获得答案。使用递归需要注意退出递归的条件:
1.天平一直不平衡,需要判断到下标为0的银币
2.天平平衡,则可以判断出假币
3.天平不平衡,但未到下标为0,即可以进行递归
在下面的程序中函数void coincheck(int sum1, int sum2,int index1,int index2)的参数意义分别为:sum1,sum2为当前天平的币重量,index1,index2为从天平取下来的银币下标。
#include<iostream>
#include<array>
int count = 0;//记录次数
std::array<int, 8>coin = { 0 };//硬币
void coincheck(int sum1, int sum2,int index1,int index2)
{
if (index1 == 0)//需要判断到0枚说明码盘上一直不相等
{
count++;
if (coin[0] == coin[1])//和真币比较
{