拿雞蛋python 扔雞蛋問題python編寫

2021-10-11 22:30:02 字數 1418 閱讀 1072

#分析,假設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 層扔下,如果碎了,說明安全樓層...