Egg Dropping Puzzle[DP][GFG]

1–2 minutes

read

Egg Dropping Puzzle[DP][GFG]

Problem:

The following is a description of the instance of this famous puzzle involving n=2 eggs and a building with k=36 floors.

Suppose that we wish to know which stories in a 36-story building are safe to drop eggs from, and which will cause the eggs to break on landing. We make a few assumptions:

…..An egg that survives a fall can be used again.
…..A broken egg must be discarded.
…..The effect of a fall is the same for all eggs.
…..If an egg breaks when dropped, then it would break if dropped from a higher floor.
…..If an egg survives a fall then it would survive a shorter fall.
…..It is not ruled out that the first-floor windows break eggs, nor is it ruled out that the 36th-floor do not cause an egg to break.
In this problem you have to find minimum trials to solve for n eggs and k floors.
For more description on this problem see wiki page

Input:
The first line contains an integer T, depicting total number of test cases.
Then following T lines contains 2 integers n and k.
Output:
Print the minimum trials required to solve the problem.
Constraints:
1<=T<=30
1<=n<=10
1<=k<=50
Example:
Input:
1
2 10

Output:
4

Code:

#include<bits/stdc++.h>
#include<bits/stdc++.h>
using namespace std;
int eggdroping(int eggs,int floors)
{
    int dp[eggs+1][floors+1];
    int c=0;
    for(int j=0;j<=floors;j++)
    {
        dp[1][j] = j;
    }
    for(int i=2;i<=eggs;i++)
    {
        for(int j=1;j<=floors;j++)
        {
            dp[i][j] = INT_MAX;
            for(int k=1;k<=j;k++)
            {
                if(i>j)
                {
                    dp[i][j] = dp[i-1][j];
                }
                else
                {
                    c = 1 + max(dp[i-1][k-1] , dp[i][j-k]);
                    if(c < dp[i][j])
                    {
                   dp[i][j] = c;
                    }
                }
            }
        }
     }
/*for(int i=0;i<=eggs;i++)
  {
      for(int j=0;j<=floors;j++)
      {
          cout<<dp[i][j]<<" ";
      }
      cout<<endl;
  }
*/
    return dp[eggs][floors];    
}

int main()
{
    int t;
    cin>>t;
    while(t--){
        int eggs,floors;
        cin>>eggs>>floors;
        cout<<eggdroping(eggs,floors)<<endl;
    }
}

All test cases passed.

Leave a comment