#分析,假設x是最優解的最多次數。則第乙個雞蛋第一次從第x層扔(不管碎沒碎,還有x-1次嘗試機會)。
# 如果碎了,則第二個雞蛋在1~x-1層中線性搜尋,最多x-1次;
# 如果沒碎,則第乙個雞蛋第二次從x+(x-1)層扔(現在還剩x-2次嘗試機會)。
# 如果這次碎了,則第二個雞蛋在x+1~x+(x-1)-1層中線性搜尋,最多x-2次;
# 如果還沒碎第乙個雞蛋再從x+(x-1)+(x-2)層扔,依此類推。
# x次嘗試所能確定的最高樓層數為x+(x-1)+(x-2)+...+1=x(x+1)/2。
#1.兩個雞蛋問題f[n] = min 初始條件: f[0]=0(或f[1]=1)
#2.m個雞蛋問題f[n,m] = min 初始條件:f[i,0]=0(或f[i,1]=i)
import numpy as np
def computemindropsinworstcase(eggs,floors):
table=np.zeros((eggs+1,floors+1))
#如果只有0樓或者一樓時
for i in range(eggs+1):
table[i][0]=0
table[i][1]=1
#如果只有乙個雞蛋
for j in range(floors+1):
table[1][j]=j
#其他情況,table( eggs, floors) = 1+ max(table( eggs-1 , floors-1), table( eggs, floors-x))
for i in range(2,eggs+1):
for j in range(2,floors+1):
table[i][j]=2**63-1
for x in range(1,j):
#table[i-1][x-1]表示雞蛋在x樓碎了減小乙個。table[eggs][j-x]表示雞蛋還是最開始的
# 樓層變為j-x
maxtable=1+max(table[i-1][x-1],table[i][j-x])
if maxtable
table[i][j]=maxtable
print(table[eggs][floors])
if __name__ == '__main__':
computemindropsinworstcase(4,100)
computemindropsinworstcase(5, 100)
computemindropsinworstcase(6, 100)
computemindropsinworstcase(7, 100)
print("由此可知,當樓層固定時,雞蛋足夠時,次數也只會固定在乙個值,不會繼續減少\n"
"也就是說前期雞蛋越多次數越少,後期次數不隨雞蛋的增多而變化,二分法結果就是極限")
扔雞蛋問題
因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...
扔雞蛋問題
因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...
扔雞蛋問題
標籤 演算法 初始問題 在100層樓裡,給定2個雞蛋,在安全樓層以上的樓扔雞蛋會碎。設計一種方案,測試哪層樓是最高安全樓層,要求測試次數最少。思路 這是典型的動態規劃問題。假設 f n 表示從 n 層樓找到摔雞蛋不碎安全樓層的最少判斷次數。假設第乙個雞蛋第一次從第 i 層扔下,如果碎了,說明安全樓層...