python实现李永乐老师的双蛋问题

https://www.bilibili.com/video/av96214853

一个鸡蛋从高楼扔下,在低楼层不会摔碎,高楼层会摔碎,假设楼共100层,找出临界的楼层,即到这一层鸡蛋正好摔碎,最少要多少次

如果只有1个蛋,那么就只能从第一层扔,碎了就是1,没有到第二楼继续扔,最少要扔100次

如果有两个蛋,就先用第一个蛋确定范围,再用第二个蛋一层层测试

将100层拆分成10次,10,20…,100 ,最多10次,即90-100,之后再用另一个蛋最多扔9次 [1,9] ,最少要扔19次

优化下,最开始扔n层,之后n-1层,之后n-2层……,最后扔1层,这样,每一层扔的次数都一样是n+1,

计算n的值:n+(n-1)+……+1=100,等差数列,(1+n)*n/2=100,n^2+n=200,n^2+n+1/4=200.25,n=(200.25)^(1/2)-0.5=13.65,n取14

14,27,39,50,60,69,77,84,90,95,99,100 ,最多扔了12次,那最少要扔14次,

问题拓展,假如我有n个蛋,楼总共有t层楼,计算出最少要扔多少次 记为M

式子为:M=fun(n,t),

1.当n为1时,总是有M=t,

2.当t=1时,总是有M=1,

也就是问题至少要是2个蛋,楼有两层,即fun(2,2),才开始计算。

先扔第一个鸡蛋,在第k层扔,1<=k<=t;

两种结果,1、碎,临界楼层在1到k层,下一次扔fun(n-1,k),之中。

2、不碎,临界楼层在上面,fun(n,t-k),之中,

取两者的最大值,max{ fun(n-1,k-1) , fun(n,t-k) } + 1

k需要从第1层,一直第t层,这样找出最小的 max{ fun(n-1,k-1) , fun(n,t-k) } + 1 的值,

作为f(n,t)的值

fun(2,2)=min{ fun(2,1) , fun(1,2) } + 1 ; #因为要比上一种多扔最后一次。

--按照李永乐老师的递归思想,程序开销很大,楼层越高开销越大,之后改成循环做处理

式子为:M=fun(n,t),

1.当n为1时,总是有M=t,

2.当t=1时,总是有M=1,


def fun_recursion(v_floors, v_eggs):if v_eggs == 1:return v_floorsif v_floors == 1:return 1if v_eggs == 0 or v_floors == 0:return 0;v_min = 1000000;for i in range(1, v_floors + 1):result_1 = fun_recursion(i - 1, v_eggs - 1) + 1;result_2 = fun_recursion(v_floors - i, v_eggs) + 1;v_min = min(v_min, max(result_1, result_2));return v_min# 循环 动态规划思想,全局最优解包含局部最优解,由局部最优解拓展到全局最优解
# 先建立二维列表保存结果数据,将只有1个鸡蛋和只有1层楼的情况填写到列表中, 之后再有局部解推出全局解
def fun_cycle(v_floors, v_eggs):  # 5 2list_2d = [[0 for col in range(v_eggs)] for row in range(v_floors)]  # 用于保存局部解存放楼层和鸡蛋的值,第一维度为楼层数,第二维度为鸡蛋数# list_2d[v_floors][v_eggs]for m in range(v_floors):  # 只有1个鸡蛋时list_2d[m][0] = m + 1;for m in range(v_eggs):  # 只有1层楼时list_2d[0][m] = 1;# 从两个蛋,两层楼 逐步开始求解for v_floor in range(1, v_floors):for v_egg in range(1, v_eggs):# k记录第一个蛋扔的层数,从第二层开始扔v_min = 1000000;for k in range(1, v_floor + 1):result_1 = list_2d[k - 1][v_egg - 1]  # 蛋碎了,临界楼层应该在k-1result_2 = list_2d[v_floor - k - 1][v_egg]  # 蛋没碎,临界楼层应该在j-kv_max = max(result_1, result_2) + 1v_min = min(v_min, v_max)list_2d[v_floor][v_egg] = v_min# 打印循环结果for i in range(v_floors):print(list_2d[i])return list_2d[v_floors - 1][v_eggs - 1]# 打印递归结果
for i in range(1, 20):for j in range(1, 10):print(fun_recursion(i, j), end=' ')print('')# print(fun_cycle(20, 10))
# print(fun_recursion(2, 3))

双蛋问题的递归解法和循环解法相关推荐

  1. java 约瑟夫单循环_约瑟夫问题(Josephus问题)的递推O(n)解法、循环解法、单循环链表解法 | 学步园...

    (一) O(n)时间的解法 只能解出最后一个出局的人,也就是最后留下的人--默认是从编号为1的人开始数起 n个人在一个圆桌上吃饭,每m个人杀掉一个,直到最后剩下一个人. 问最后剩下哪个人? 将人分别标 ...

  2. 观李永乐老师《双蛋问题》解题后感

    观李永乐老师<双蛋问题>解题后感 题目开始前,随便说几句. 随便说几句,就是随随便便说的,看不懂没关系.随便说,可能会表达得不好,当作阅读前的热身 . 李永乐老师双蛋问题,大概就是讲,给你 ...

  3. python解决双蛋问题

    今天在codewar中挑战kata的时候遇到了这么一道题  这道题是一道经典的双蛋问题(或者又双叒叕蛋问题),不过又有所区别,传统的双蛋问题是给定n个蛋(假定n个蛋完全一致),从楼层为T的摩天大楼中扔 ...

  4. 关于递归转换成循环的思想

    1 问题描述 今天在看Python的课程时 听到老师讲到了递归 实际上 在我大学学编程课的时候 就听到老师们说过 递归不是一种很好定义函数逻辑的方式 这是因为在递归过程中 程序为了保存函数现场的变量需 ...

  5. php 循环 post,如何在php中使用jQuery递归调用POST循环请求

    如何在php中使用jQuery递归调用POST循环请求 发布时间:2021-01-28 17:37:18 来源:亿速云 阅读:79 作者:Leah 这期内容当中小编将会给大家带来有关如何在php中使用 ...

  6. 千锋深圳校区相亲会 双蛋之夕不再孤单

    我们不是呆板木讷的IT男,我们也不是邋里邋遢的技术男,我们也有英俊潇洒的外貌,我们也是善解人意的暖男......别被我们一天几十万代码的拼命劲吓到,别小看我们讨女孩子欢心的能力......只因为天天面 ...

  7. 面试题-双蛋问题(动态规划)

    肺炎疫情期间,在B站上看了李永乐老师关于双蛋问题的视频,刚好我最近写了一篇关于动态规划的文章,这里我们试着使用动态规划的思想简单分析下这个问题. 一.问题描述 有一座100层的楼,有一个鸡蛋,在低楼层 ...

  8. [dp]双蛋问题李永乐老师视频

    2022.10.1更新,此题目在leetcode.cn上有原题,并且有大量详细的题解,见 887. 鸡蛋掉落 一.背景 今天看李永乐老师的科普视频,里面提到的双蛋问题很有意思.思考了下发现是动态规划问 ...

  9. 圣诞新年送豪礼《远征》双蛋运动开启--国民网游戏

    圣诞元旦送豪礼<远征>双蛋活动开启--国民网游戏原题目:圣诞新年送豪礼<远征>双蛋活动开启 瑞雪纷飞,麋鹿报喜,圣诞老人乘雪撬离开<远征>世界,为玩家们送上圣诞祝愿 ...

最新文章

  1. Apache访问日志详解
  2. java gstripe_通过Stripe Connect进行交易
  3. python自学什么书比较好-有什么好的自学 Python 的书籍推荐?
  4. SQL server连接到服务器,无法连接到 (local)。在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Se
  5. 16个经典面试问题回答规律
  6. NFS文件系统简介及原理
  7. 分享下多年积累的对JAVA程序员成长之路的总结
  8. Google推出“Google实验室” Ad Innovations
  9. 透明怎么弄_最新版微信如何设置透明背景?这样设置,效果令人惊喜
  10. 银行理财收益复利还是单利?
  11. 机器学习基础(十五)—— blending
  12. hexo 搜索_Hexo+Github博客最简教程-Dockerfile自动搭建
  13. 用计算机做动画,如何制作动画
  14. 量子密码(二)——经典的希特勒密码、紫色密码、乘数密码以及量子密码、量子纠缠初探
  15. 有关信息论和 error-control coding 的简单介绍
  16. spring的shema文件如何读取
  17. 适配器模式 个人理解+JAVA 小例子
  18. 2021级程序设计ICODING答案分享
  19. 3D-LaneNet:端到端三维多车道检测ICCV2019
  20. 关闭Chrome浏览器的自动更新和升级提示

热门文章

  1. 网格索引 和四叉树索引
  2. 智工教育:公务员网上报名确认事项与流程的状态标识
  3. DevOps实战系列【第十三章】:流水线应用工具Blue Ocean使用
  4. GPS常识-B版(简)
  5. uintptr和unsafe.Pointer的区别
  6. 开发一个基于ZXing库以及安卓Studio的二维码扫描小程序(二)
  7. 海康威视、大华摄像头RTSP视频流嵌入到谷歌Chrome等VUE页面中实时播放方案(图文教程)
  8. MRI常用术语中英文对照
  9. spring里结合POI生成EXCEL
  10. matlab sglay平滑,基于MATLABGUI的谱线平滑处理.PDF