import numpy as np
def egg_break(N, k):
table = dict()
def dp(N, k):
if N == 0:
return 0
if k == 1:
return N
if (N, k) in table:
return table[(N, k)]
res = np.inf
low = 1
high = N
while low <= high:
mid = (low + high) // 2
b = dp(mid - 1, k - 1)
u = dp(N - mid, k)
if b > u:
res = min(res, b + 1)
high = mid - 1
else:
res = min(res, u + 1)
low = mid + 1
table[(N, k)] = res
return res
return dp(N, k)
if __name__ == '__main__':
print('最坏情况下所需扔鸡蛋数:{}'.format(egg_break(100, 2)))
print('最坏情况下所需扔鸡蛋数:{}'.format(egg_break(100, 4)))
print('最坏情况下所需扔鸡蛋数:{}'.format(egg_break(200, 2)))
在鸡蛋数相同的情况下,楼层越多,最坏情况下查找次数会越多,也就是说dp函数关于楼层数是单调的,使用二分法求解。