称硬币问题-Python:
一. 问题描述
现在有27枚硬币,其中有一枚假币,假币跟真币长得一摸一样,但是稍微重一些。摆在桌上有一个称重天平,要求用最小的次数找出假币,并写出算法代码。
二. 解题思路
首先,思考一下这个问题的解法,很多人开始想到的都说对开。就是把硬币分成两份,比如假如我们有9个硬币,每4一份,分成4,4,1三份,再对前两份进行称重。那么可能有3个结果:
1).两份完全相等,剩下的1个就是假币
2).第一组更重,然后继续二分称重
3).第二组更重,然后继续类似上面第二种情况进行称重
我们需要3次才能找到,这个是不是最优的解法呢,显然不是,何况现在的题目是27枚硬币!
三. 更优解法:
应该采用的是分而治之的方法,我们还是先拿简单的9枚举例,把9枚硬币分成3份,3,3,3,然后称重,应该是3种结果:
1).第一组和第二组一样重,那么假的在第三组里面,再称一次即可找出;
2).第一组更重,那么假的在第一组,再称一次即可;
3).第二组更重,那么假的在第二组,再称一次即可;
这个的算法,看起来更简介,大概需要2次,如果是27枚,只要多分一次9,9,9 ,最后3次即可。
四. 代码实现需要解决的三个问题:
第一,把硬币分3组;
第二,把分组的硬币称重;
第三,遍历寻找最重的里面的假币
- 1).分组问题
拿到一串硬币,我们需要分成3等份,直接用切片把列表切割一下即可。
def fenzu (coins):
length=len(coins)
group_a=coins[0 : length//3