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