丟雞蛋問題


這是一個著名的謎題。假設有一幢有 n 層樓高的建築,我們有 m 個雞蛋,我們如何才能找出可以安全地從某個樓層扔雞蛋而不打碎它的最小扔數。

有一些重要的事項需要記住 -

  • 如果雞蛋從某一層樓扔下沒打碎,那麼從任何更低樓層扔下都不會打碎。
  • 如果雞蛋從某一層樓扔下打碎了,那麼從所有更高樓層扔下都會打碎。
  • 如果雞蛋打碎了,它就必須扔掉,否則我們還可以再次使用它。

輸入和輸出

Input:
The number of eggs and the maximum floor. Say the number of eggs are 4 and the maximum floor is 10.
Output:
Enter number of eggs: 4
Enter max Floor: 10
Minimum number of trials: 4

演算法

eggTrialCount(eggs, floors)

輸入:雞蛋個數,最高樓層。

輸出 - 獲得最小試驗次數。

Begin
   define matrix of size [eggs+1, floors+1]
   for i:= 1 to eggs, do
      minTrial[i, 1] := 1
      minTrial[i, 0] := 0
   done

   for j := 1 to floors, do
      minTrial[1, j] := j
   done

   for i := 2 to eggs, do
      for j := 2 to floors, do
         minTrial[i, j] := ∞
         for k := 1 to j, do
            res := 1 + max of minTrial[i-1, k-1] and minTrial[i, j-k]
            if res < minTrial[i, j], then
               minTrial[i,j] := res
         done
      done
   done

   return minTrial[eggs, floors]
End

示例

#include<iostream>
using namespace std;

int max(int a, int b) {
   return (a > b)? a: b;
}

int eggTrialCount(int eggs, int floors) {    //minimum trials for worst case
   int minTrial[eggs+1][floors+1];    //to store minimum trials for ith egg and jth floor
   int res;

   for (int i = 1; i <= eggs; i++) {    //one trial to check from first floor, and no trial for 0th floor
      minTrial[i][1] = 1;
      minTrial[i][0] = 0;
   }

   for (int j = 1; j <= floors; j++)    //when egg is 1, we need 1 trials for each floor
      minTrial[1][j] = j;

   for (int i = 2; i <= eggs; i++) {    //for 2 or more than 2 eggs
      for (int j = 2; j <= floors; j++) {    //for second or more than second floor
         minTrial[i][j] = INT_MAX;
         for (int k = 1; k <= j; k++) {
            res = 1 + max(minTrial[i-1][k-1], minTrial[i][j-k]);
            if (res < minTrial[i][j])
               minTrial[i][j] = res;
         }
      }
   }

   return minTrial[eggs][floors];    //number of trials for asked egg and floor
}

int main () {
   int egg, maxFloor;
   cout << "Enter number of eggs: "; cin >> egg;
   cout << "Enter max Floor: "; cin >> maxFloor;
   cout << "Minimum number of trials: " << eggTrialCount(egg, maxFloor);
}

輸出

Enter number of eggs: 4
Enter max Floor: 10
Minimum number of trials: 4

更新於: 16-Jun-2020

545 次瀏覽

職業生涯啟動

完成課程並透過認證

開始
廣告