演算法篇(1)

渣渣強發表於2018-10-14

丟雞蛋問題

描述:有兩個雞蛋,從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
複製程式碼

相關文章