算法篇(1)

220 阅读1分钟

丢鸡蛋问题

描述:有两个鸡蛋,从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