拿鸡蛋python_扔鸡蛋问题python编写

#分析,假设x是最优解的最多次数。则第一个鸡蛋第一次从第x层扔(不管碎没碎,还有x-1次尝试机会)。

# 如果碎了,则第二个鸡蛋在1~x-1层中线性搜索,最多x-1次;

# 如果没碎,则第一个鸡蛋第二次从x+(x-1)层扔(现在还剩x-2次尝试机会)。

# 如果这次碎了,则第二个鸡蛋在x+1~x+(x-1)-1层中线性搜索,最多x-2次;

# 如果还没碎第一个鸡蛋再从x+(x-1)+(x-2)层扔,依此类推。

# x次尝试所能确定的最高楼层数为x+(x-1)+(x-2)+...+1=x(x+1)/2。

#1.两个鸡蛋问题f[n] = min{ 1+max(i-1,f[n-i]) | i=1..n } 初始条件: f[0]=0(或f[1]=1)

#2.m个鸡蛋问题f[n,m] = min{ 1+max(f[i-1,m-1], f[n-i,m]) | i=1..n } 初始条件:f[i,0]=0(或f[i,1]=i)

import numpy as np

def computeMinDropsInWorstCase(eggs,floors):

table=np.zeros((eggs+1,floors+1))

#如果只有0楼或者一楼时

for i in range(eggs+1):

table[i][0]=0

table[i][1]=1

#如果只有一个鸡蛋

for j in range(floors+1):

table[1][j]=j

#其他情况,table( eggs, floors) = 1+ Max(table( eggs-1 , floors-1), table( eggs, floors-x))

for i in range(2,eggs+1):

for j in range(2,floors+1):

table[i][j]=2**63-1

for x in range(1,j):

#table[i-1][x-1]表示鸡蛋在X楼碎了减小一个。table[eggs][j-x]表示鸡蛋还是最开始的

# 楼层变为j-x

maxtable=1+max(table[i-1][x-1],table[i][j-x])

if maxtable

table[i][j]=maxtable

print(table[eggs][floors])

if __name__ == '__main__':

computeMinDropsInWorstCase(4,100)

computeMinDropsInWorstCase(5, 100)

computeMinDropsInWorstCase(6, 100)

computeMinDropsInWorstCase(7, 100)

print("由此可知,当楼层固定时,鸡蛋足够时,次数也只会固定在一个值,不会继续减少\n"

"也就是说前期鸡蛋越多次数越少,后期次数不随鸡蛋的增多而变化,二分法结果就是极限")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值