正確和最佳的解決方案是13, 25, 36, 46, 55, 64, 72, 79, 85, 90, 94, 97, 99, 100
其中,雞蛋打破發現地板的平均嘗試次數最少,假設雞蛋打破的地板是隨機選擇的。
基於這些信息,我們可以寫一個遞歸函數,以儘量減少平均試驗,給出的
13, 25, 36, 46, 55, 64, 72, 79, 85, 90, 94, 97, 99, 100
的解決方案,具有以下每層步
13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14
這是最大的試驗顯然比天真的解決方案要好得多,假設從14開始的差距縮小了。在這種情況下,55%的時間你只需要13次試驗。這是非常接近從n (n+1)/2 >= 100
得出最優的解決方案,使n = 13.651
和我們的最佳解決方案是(13*5+14*9)/14
即13.643
這裏是一個快速的實現:
import sys
def get_max_trials(floors):
pf = 0
trials = []
for i, f in enumerate(floors):
trials.append(i+f-pf)
pf = f
return trials
def get_trials_per_floor(floors):
# return list of trials if egg is assumed at each floor
pf = 0
trials = []
for i, f in enumerate(floors):
for mid_f in range(pf+1,f+1):
trial = (i+1) + f - mid_f + 1
if mid_f == pf+1:
trial -= 1
trials.append(trial)
pf = f
return trials
def get_average(floors):
trials = get_trials_per_floor(floors)
score = sum(trials)
return score*1.0/floors[-1], max(trials)
floors_map = {}
def get_floors(N, level=0):
if N == 1:
return [1]
if N in floors_map:
return floors_map[N]
best_floors = None
best_score = None
for i in range(1,N):
base_floors = [f+i for f in get_floors(N-i, level+1)]
for floors in [base_floors, [i] + base_floors]:
score = get_average(floors)
if best_score is None or score < best_score:
best_score = score
best_floors = floors
if N not in floors_map:
floors_map[N] = best_floors
return best_floors
floors = get_floors(100)
print "Solution:",floors
print "max trials",get_max_trials(floors)
print "avg.",get_average(floors)
naive_floors = [14, 27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100]
print "naive_solution",naive_floors
print "max trials",get_max_trials(naive_floors)
print "avg.",get_average(naive_floors)
輸出:
Solution: [13, 25, 36, 46, 55, 64, 72, 79, 85, 90, 94, 97, 99, 100]
max trials [13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14]
avg. (10.31, 14)
naive_solution [14, 27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100]
max trials [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12]
avg. (10.35, 14)
這裏也討論了這個問題: http://stackoverflow.com/questions/6547/two-marbles/6871#6871 – Martin 2010-11-13 10:14:41
是啊,這就是我什麼無法弄清楚,我們在這種差異中失去了什麼,它沒有給出最佳值。 – 2010-11-13 10:16:49
我無法弄清楚問題所在。兩個雞蛋都是相同的,但一個會在一樓打破,另一個甚至不會在100?這......與我熟悉的術語的定義並不完全相同。 – 2010-11-13 10:48:31