扔雞蛋問題

2022-08-29 20:48:22 字數 2239 閱讀 4289

標籤: 演算法

初始問題:在100層樓裡,給定2個雞蛋,在安全樓層以上的樓扔雞蛋會碎。設計一種方案,測試哪層樓是最高安全樓層,要求測試次數最少。

思路:這是典型的動態規劃問題。

假設\(f[n]\)表示從\(n\)層樓找到摔雞蛋不碎安全樓層的最少判斷次數

假設第乙個雞蛋第一次從第\(i\)層扔下,

如果碎了,說明安全樓層低於\(i\)。剩乙個雞蛋,為確定\(i-1\)下面樓層中的安全樓層,必須從第一層挨著試直到\(i-1\)層,還需要扔\(i-1\)次雞蛋;

如果不碎的話,說明安全樓層高於\(i\)。問題轉化為,在以第\(i+1\)層為地面的\(n-i\)層樓裡找安全樓層,還有兩個雞蛋,即還需要扔\(f[n-i]\)次雞蛋。

因此,在上述兩種情況中,最差情況是扔\(1 + max(i-1,f[n-i])\)次雞蛋。

狀態轉移方程:$$f[n] = min$$

初始條件:$$f[0]=0, f[1]=1$$

**實現

//@num 層數

public static int dropegg(int num)

dp[n] = min;

} return dp[num];

}

問題擴充套件:\(n\)層樓與\(m\)個雞蛋的問題。

假設\(f[n,m]\)表示\(n\)層樓、\(m\)個雞蛋情況下,找到摔雞蛋不碎的安全樓層的最少判斷次數

假設乙個雞蛋從第\(i\)層扔下,

如果碎了,還剩\(m-1\)個雞蛋,為確定下面樓層中的安全位置,還需要扔\(f[i-1,m-1]\)次雞蛋;

如果不碎,上面還有\(n-i\)層,還需要扔\(f[n-i,m]\)次雞蛋。

因此,在上述兩種情況中,最差情況是扔\(1 + max(f[i-1,m-1],f[n-i,m])\)次雞蛋。

狀態轉移方程:$$f[n,m] = min$$

初始條件:$$f[i,0]=0,f[i,1]=i$$

//@num 層數

//@egg 雞蛋數

public static int dropegg(int num, int egg)

for (int i = 0; i < dp[0].length; i++)

for (int n = 2; n <= num; n++)

dp[n][m] = min;

} }return dp[num][egg];

}

回到初始問題,怎麼設計這個扔雞蛋方案呢?

我們先假設最壞情況下,雞蛋下落次數為\(x\),即我們為了找出\(n\),一共用雞蛋做了\(x\)次的實驗。

那麼,我們第一次應該在哪層樓往下扔雞蛋呢?

先讓我們假設第一次是在第\(y\)層樓扔的雞蛋,如果第乙個雞蛋在第一次扔就碎了,我們就只剩下乙個雞蛋,要用它準確地找出\(n\),只能從第一層向上,一層一層的往上測試,直到它摔壞為止,答案就出來了。

由於第乙個雞蛋在第\(y\)層就摔破了,所以最壞的情況是第二個雞蛋要把第\(1\)到第\(y-1\)層的樓都測試一遍才得出結果。

這樣一來測試次數是\(1+(y-1)=x\),即第一次測試要在第x層。

那如果第一次測試雞蛋沒摔破呢,那\(n\)肯定要比\(x\)大,要繼續往上找,需要在哪一層扔呢?

如果第乙個雞蛋在第二次測試中摔破了,那麼第二個雞蛋的測試次數就只剩下\(x-2\)次了(第乙個雞蛋用了2次)。

這樣一來,第二次扔雞蛋的樓層和第一次扔雞蛋的樓層之間就隔著\(x-2\)層。我們再回過頭來看一看,第一次扔雞蛋的樓層在第\(x\)層,第1層到第\(x\)層間共\(x\)層;第1次扔雞蛋的樓層到第2次扔雞蛋的樓層間共有\(x-1\)層(包含第2次扔雞蛋的那一層),同理繼續往下,我們可以得出,第2次扔雞蛋的樓層到第3次扔雞蛋的樓層間共有\(x-2\)層……最後把這些互不包含的區間數加起來,應該大於等於總共的樓層數量100,即

\[x + (x-1) + (x-2) + ... + 1 >= 100

\]\[(x+1)*x/2 >= 100

\]得出\(x=14\)。

即測試序列為14,27,39,50,60,69,77,84,90,95,99,100。

扔雞蛋問題

因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...

扔雞蛋問題

因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...

樓層扔雞蛋問題

有限層數和蛋數,求即使最壞情況下需要的最少判斷次數 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。參見 兩個雞蛋 一道google面試題 這是典型的動態規劃問題。假設f...