丢鸡蛋问题
描述:有两个鸡蛋,从100层往下扔下去,以此来测试鸡蛋的硬度,假设在9层鸡蛋没有破碎,在10层摔坏,那么鸡蛋不会摔坏的临界点就是9层。
问:如何用最少的次数尝试次数,测试出鸡蛋不会摔碎的临界点。
假设法,假如这个问题有最优解,最优解的解读是最坏尝试次数的上限,那么假设最优解是x次,那么第一次尝试的位置应该就是x位置。因为假如这个位置摔坏了,我们剩下一个鸡蛋只能从1层往x-1逐步尝试。假如这个位置没有摔坏,问题就变成一个子问题,在n-x的高度下,假设最优解是x-1(前面尝试过一次),第一次尝试的位置是哪里。
f(x) = min(max(i, f(x-i)+1)) (1<=i<=x)
max表达经过i最坏结果,最小化的最坏结果为最优解
大致可以描述成f(x)的最优解是在i取得某个值下,i和f(x-i)+1的最大值取得最小值。
那么本质上这个问题属于动态规划的一个问题:
record_dict = {}
def f(n):
if n == 1:
return 1
min = n+1
for i in range(2, n):
if n-i in record_dict:
compare_right = record_dict[n-i]
else:
compare_right = f(n-i)
record_dict[n-i] = compare_right
max_v = max(i, compare_right+1)
if min > max_v:
min = max_v
return min