称硬币问题-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]group_b=coins[length//3 : length//3*2]group_c=coins[length//3*2 : length]return group_a,group_b,group_c
  • 2).硬币称重
    两种硬币进行称重对比代码实现
#称重
def chengzhong (group_a,group_b):if sum(group_a) > sum(group_b):result=('left')elif sum(group_a) < sum(group_b):result=('right')else:result =('equal')return result
  • 3).寻找假币
    这个里面分两步走,第一步先寻找假币,就是给你3组,进行判断。
    如果第一组和第二组对比称重,左边重,那么假币就在第一组中;
    如果第二组重,就是右边重,那么假币就在第二组重;
    如果都不是,假币在第三组中。
#找假币
def find_fake(group_a,group_b,group_c):res=chengzhong (group_a,group_b)if res=='left':return group_aelif res=='right':return group_belif res=='equal':return group_c
  • 4).遍历寻找
    times 用于记录搜索的次数,而search_list是一个可变的列表,每次称重完了之后,它会变成三分之一的长度,不断的缩小,直到搜索结束。
#遍历寻找
def bianlifind(coins):times=0search_list=coinswhile len(search_list)> 1:print('search_list',search_list)g1,g2,g3=fenzu(search_list)search_list=find_fake(g1,g2,g3)times += 1fake=search_list[0]print(f'错误的硬币在第{fake}组')print(f'称重次数{times}')
coins=[1,1,1,2,1,1,1,1,1]
bianlifind(coins)

五. 总结和反思:
在以上的代码中输入的硬币个数是在整除3的情况下实现的。
在实际操作中:
当硬币个数不能整除3时,应该怎么做?

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

七. 思路:
将硬币分为3堆,则每堆的硬币数量为 n/3 ,但是这是在 n%3==0 的情况下才能成立,所以我们将 n 枚硬币分为 3 堆加 1 堆 余数堆(余数堆可能为0),则可分为如下(n-n%3)/3, (n-n%3)/3, (n-n%3)/3, n%3。
如下分组:
a堆: (n-n%3)/3
b堆: (n-n%3)/3
c堆: (n-n%3)/3
d(余数堆): n%3

八、逻辑过程:

  1. 判断n中的硬币数量,如果n>2则执行2,否则执行5.
  2. 将n分为上图的四堆,拿 a 和 b 比较,如果 a == b ,则 假币在 c 或 d 中。否则假币在 a 或 b 中。
  3. 如果 a == b,则拿 a 和 c 比较。如果 a == c,则假币在d(余数堆)中。将 d 再次 执行流程1,并且n=n%3。如果不等,则假币在 c 中,将 c 再次 执行流程1,并且n=(n-n%3)/3。
  4. 如果 a != b,则拿 a 和 c 比较。如果 a == c,则假币在b中,将 b 再次 执行流程1,并且n=(n-n%3)/3。如果不等,则假币在 a 中,将 a 再次 执行流程 1,并且n=(n-n%3)/3。
  5. 如果n==2,则将两枚硬币进行比较找出假币。
  6. 如果n==1,则该硬币就是假币,输出结果结束。

九.逻辑图:

称硬币问题-Python相关推荐

  1. 数学模型中包括多个变量的例子:称硬币

    //数学模型中包括多个变量的例子:称硬币 #include<stdio.h> #include<string.h>char left[3][7],right[3][7],res ...

  2. 程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币

    程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币 有12枚硬币.其中有11枚真币和1枚假币.假币和真币重量不同,但不知道假币比真币轻还是重.现在,用一架天平称了这些币三次,告诉你称的结果,请你找 ...

  3. 枚举算法称硬币C语言,【算法系列之枚举】称硬币

    题目 有12枚硬币.其中有11枚真币和1枚假币.假币和真 币重量不同,但不知道假币比真币轻还是重.现在, 用一架天平称了这些币三次,告诉你称的结果,请你 找出假币并且确定假币是轻是重(数据保证一定能找 ...

  4. P1146 硬币翻转 python题解

    一直都听石佬强推洛谷,说上面的讨论氛围很好.今天试了一下,花了一个小时左右,完成了自己的第一道题.借鉴了大佬的题解思路,理解的同时,自己用python完成了一份,下图是第一个ac,小小记录一下嘿嘿嘿. ...

  5. POJ1013 称硬币

    有12枚硬币.其中有11枚真币和1枚假币.假币和真 币重量不同,但不知道假币比真币轻还是重.现在, 用一架天平称了这些币三次,告诉你称的结果,请你 找出假币并且确定假币是轻是重(数据保证一定能找 出来 ...

  6. POJ 1013 Counterfeit Dollar 称硬币

    12个硬币,有一个假的 或轻或重,找出假硬币 开始用的模拟,考虑很多情况 后来,lmy说轻的-1,重的+1,学数学的看什么都是数字,orz 模拟写的两个差不多的代码: (一) #include< ...

  7. 硬币兑换python 每个面值有多个_【算法27】硬币面值组合问题

    问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n.例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 ...

  8. EM算法解决二硬币问题(python)

    前言 EM算法是很多深度学习的基础,这里我们以一个简单的例子去探寻EM算法的原理. 关于EM算法的原理,可见: EM算法详解 (知乎) 不断更新,先挖坑 代码来源: https://github.co ...

  9. 硬币组合问题python_关于硬币的python问题

    展开全部 # coding:utf8 import random def chkcoin(acoin): basecoin = [1, 5, 10, 25] flag = False for bc i ...

最新文章

  1. Paddle 网络中的Tensor 数据结构
  2. python和c++哪个好学-C++和Python哪一个更好?
  3. [票据打印]打印走纸控制(1) - 设置纸型
  4. 演讲|微软全球公共事业部政府行业总经理Mark Day:第四次工业革命的数字红利...
  5. python 打开本地程序发生异常_Python中的异常处理
  6. android用单元测试的多,AndroidStudio中对Android应用进行单元测试InstrumentationTestCase...
  7. Vue 3.0没有config文件解决方法
  8. 对象转为json形式
  9. lol无法连接服务器win10系统,win10系统中lol无法连接服务器怎么办
  10. AI生活助理玩秘获1000万元Pre-A融资,启赋资本和英诺天使基金投资
  11. C#图片处理:生成大尺寸图片,以边框颜色填充
  12. Windows server 2012 R2添加桌面图标(计算机、控制面板、网络等)
  13. 房产管理系统CAD图形管理应用有哪些?
  14. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part5-完结):信息检索与结果组装
  15. 用 Python 监控 NASA TV 直播画面
  16. sql面试重点之minus 2021-11-05
  17. NTP-Chrony 服务器和客户端配置
  18. 拓嘉辰丰电商:拼多多一件代发三大优势有哪些
  19. python内建函数是什么意思_python、什么是内建函数?
  20. @click.stop和@click.prevent区别

热门文章

  1. 拼多多商品详情页 API接口、拼多多商品SKU数据接口 API接口、拼多多关键词搜索接口 API接口 API接口、拼多多关键词采集 API接口、拼多多采集接口 API接口、拼多多详情 API接口
  2. 语音控制垃圾分类箱的制作
  3. java swing 跳转窗口_java swing 怎么实现点击按钮或者某个组件,跳转到另一个页面或者窗体?...
  4. linux服务器黑客攻防
  5. js在指定的td中插入html元素,js在指定位置增加节点函数insertBefore()用法实例
  6. 博达:经营管理再升级,从选对CRM开始
  7. 苹果5s参数_这次,苹果自己革了自己的命---iPhone12发布会全纪实
  8. pb 制作程序运行报错界面
  9. [ESP32][esp-idf] AP+STA实现无线桥接 中转wifi信号 路由器
  10. 和sar比起来,其他Linux命令都是猹