鸡蛋掉落拼图的Java程序| DP-11
下面是这个著名的谜题实例的描述,它涉及 n=2 个鸡蛋和一个 k=36 层的建筑物。
假设我们想知道 36 层楼的哪些楼层可以安全地掉落鸡蛋,哪些楼层会导致鸡蛋在落地时破裂。我们做几个假设:
......一个在坠落中幸存下来的鸡蛋可以再次使用。
......必须丢弃破碎的鸡蛋。
…..跌倒的效果对所有鸡蛋都是一样的。
…..如果鸡蛋在掉落时会破裂,那么如果从较高的地板上掉落,它就会破裂。
......如果一个鸡蛋在坠落中幸存下来,那么它会在较短的坠落中幸存下来。
……..不排除一楼窗户破蛋,也不排除36楼不破蛋。
如果只有一个鸡蛋可用,并且我们希望确保获得正确的结果,则只能以一种方式进行实验。从一楼窗户掉下鸡蛋;如果它幸存下来,请将其从二楼的窗户扔下。继续向上直到它破裂。在最坏的情况下,这种方法可能需要 36 次粪便。假设有 2 个鸡蛋可用。保证在所有情况下都有效的最少蛋液数量是多少?
问题实际上并不在于找到关键楼层,而只是决定应该从哪个楼层掉下鸡蛋,以便尽量减少试验的总数。
来源:动态编程维基
动态规划解决方案
Java
// A Dynamic Programming based Java Program for the Egg Dropping Puzzle
class EggDrop {
// A utility function to get maximum of two integers
static int max(int a, int b) { return (a > b) ? a : b; }
/* Function to get minimum number of trials needed in worst
case with n eggs and k floors */
static int eggDrop(int n, int k)
{
/* A 2D table where entry eggFloor[i][j] will represent minimum
number of trials needed for i eggs and j floors. */
int eggFloor[][] = new int[n + 1][k + 1];
int res;
int i, j, x;
// We need one trial for one floor and0 trials for 0 floors
for (i = 1; i <= n; i++) {
eggFloor[i][1] = 1;
eggFloor[i][0] = 0;
}
// We always need j trials for one egg and j floors.
for (j = 1; j <= k; j++)
eggFloor[1][j] = j;
// Fill rest of the entries in table using optimal substructure
// property
for (i = 2; i <= n; i++) {
for (j = 2; j <= k; j++) {
eggFloor[i][j] = Integer.MAX_VALUE;
for (x = 1; x <= j; x++) {
res = 1 + max(eggFloor[i - 1][x - 1], eggFloor[i][j - x]);
if (res < eggFloor[i][j])
eggFloor[i][j] = res;
}
}
}
// eggFloor[n][k] holds the result
return eggFloor[n][k];
}
/* Driver program to test to printDups*/
public static void main(String args[])
{
int n = 2, k = 10;
System.out.println("Minimum number of trials in "+
"worst case with "
+ n + " eggs and " + k + " floors is " + eggDrop(n, k));
}
}
/*This code is contributed by Rajat Mishra*/
输出:
Minimum number of trials in worst case with 2 eggs and 10 floors is 4
请参阅完整文章关于蛋掉落拼图 | DP-11 了解更多详情!