八枚银币中的假币算法

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

算法分析

大致算法过程见图1,以下为详细分析:

用一个数组存储八枚银币,首先将其分为两组:coins[0]、coins[1]、coins[2]和coins[3],coins[4],coins[5]进行比较。

(1)如果coins[0]+coins[1]+coins[2]==coins[3]+coins[4]+coins[5],就可以肯定这一枚有问题的硬币在coins[6]和coins[7]中。那么就比较coins[6]和coins[7]:

①如果coins[6]>coins[7],那么再比较coins[6]和coins[0]。

如果coins[6]=coins[0],那么就说明coins[7]为假币且较轻。如果coins[6]>coins[0],那么就说明coins[6]为假币且较重。

②如果coins[6]<coins[7],那么再比较coins[7]和coins[0]。

如果coins[7]=coins[0],那么就说明coins[6]为假币且较轻。如果coins[7]>coins[0],那么就说明coins[7]为假币且较重。

(2)如果coins[0]+coins[1]+coins[2]>coins[3]+coins[4]+coins[5],就说明这六枚硬币中必有一枚为假币,同时也说明,coins[6],coins[7]为真币。这时可将天平两端各去掉一枚硬币,假设去掉coins[2]和coins[5],与此同时,将天平两端的硬币各换一枚,假设硬币coins[1]和coins[3]作了互换,然后进行第二次比较,比较的结果同样可能有三种,这一枚有问题的硬币在这6个硬币中,那么再比较coins[0]+coins[3]和coins[1]+coins[4]:

①如果coins[0]+coins[3]>coins[1]+coins[4],就说明这一枚假币在coins[0]和coins[4]之间,且coins[0]>coins[4],那么就比较coins[0]和coins[7]。

如果coins[0]=coins[7],那么就说明coins[4]为这一枚假币且较轻,如果coins[0]>coins[7],那么就说明coins[0]为这一枚假币且较重。

②如果coins[0]+coins[3]<coins[1]+coins[4],就说明这一枚假币在coins[1]和coins[3]之间,且coins[1]>coins[3],那么就比较coins[1]和coins[7]。

如果coins[1]=coins[7],那么就说明coins[3]为这一枚假币且较轻,如果coins[1]>coins[7],那么就说明coins[1]为这一枚假币且较重。

③如果coins[0]+coins[3]=coins[1]+coins[4],就说明这一枚假币在coins[2]和coins[5]之间,且coins[2]>coins[5],那么就比较coins[2]和coins[7]。

如果coins[2]=coins[7],那么就说明coins[5]为这一枚假币且较轻,如果coins[2]>coins[7],那么就说明coins[2]为这一枚假币且较重。

(3)如果coins[0]+coins[1]+coins[2]<coins[3]+coins[4]+coins[5],就说明这六枚硬币中必有一枚为假币,同时也说明,coins[6],coins[7]为真币。这时可将天平两端各去掉一枚硬币,假设去掉coins[2]和coins[5],与此同时,将天平两端的硬币各换一枚,假设硬币coins[1]和coins[3]作了互换,然后进行第二次比较,比较的结果同样可能有三种,这一枚有问题的硬币在这6个硬币中,那么再比较coins[0]+coins[3]和coins[1]+coins[4]:

如果coins[0]+coins[3]<coins[1]+coins[4],就说明这一枚假币在coins[4]和coins[0]之间,且coins[0]<coins[4],那么就比较coins[4]coins[7]。

如果coins[4]=coins[7],那么就说明coins[0]为这一枚假币且较轻,如果coins[4]>coins[7],那么就说明coins[4]为这一枚假币且较重。

如果coins[0]+coins[3]>coins[1]+coins[4],就说明这一枚假币在coins[1]coins[3]之间,coins[1]<coins[3],那么就比较coins[3]coins[7]。

如果coins[3]=coins[7],那么就说明coins[1]为这一枚假币且较轻,如果coins[3]>coins[7],那么就说明coins[3]这一枚为假币且较重。

如果coins[0]+coins[3]=coins[1]+coins[4],就说明这一枚假币在coins[2]coins[5]之间,coins[2]<coins[5],那么就比较coins[5]coins[7]。

如果coins[5]=coins[7],那么就说明coins[2]为这一枚假币且较轻,如果coins[5]>coins[7],那么就说明coins[2]为这一枚假币且较重。

算法介绍

决策树(Decision Tree)是一种基本的分类与回归方法。决策树一般都是自上而下的来生成的,每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,由于把这种决策分支画成图形很像一棵树的枝干,故称决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。决策树是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。

决策树构造的输入是一组带有类别标记的例子,构造的结果是一棵二叉树或多叉树,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。二叉树的内部节点(非叶子节点)一般表示为一个逻辑判断,如形式为a=aj的逻辑判断,其中a是属性,aj是该属性的所有取值:树的边是逻辑判断的分支结果。多叉树(ID3)的内部结点是属性,边是该属性的所有取值,有几个属性值就有几条边。树的叶子节点都是类别标记。

猜你喜欢

转载自blog.csdn.net/YuXin0503/article/details/80351799