正确和最佳的解决方案是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