原题及其它解法见:100层楼2个鸡蛋,以下为动态规划解法。
动态规划的关键在于写出转移函数,该题的转移函数为res[i] = min{max{j, res[i - j] + 1}}, 1<=j<=i。res[i] = x表示有i层楼,扔两个鸡蛋,最少需要x步测出临界楼层;j为扔第一个鸡蛋的楼层。
该转移函数的意思是,有i层楼,第一个鸡蛋扔在j层,碎了最多尝试j次,没碎问题又转化为:有i-j层,扔两个鸡蛋,最少尝试次数res[i-j]为多少。于是第一个鸡蛋扔在j层的最多尝试次数为max{j, res[i - j] + 1}。为了取一个最优的j,使得max{j, res[i - j] + 1}最小,就要尝试不同的取值1~i。
由于在计算res[i]时,需要知道res[0]~res[i - 1],因此需要从res[0]计算起,并将每一层的结果保留下来。
c代码如下:
#include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int eggs(int n)
{
// res[i] = x : 有i层楼,扔两个鸡蛋,最少需要x步测出临界楼层
int* res = new int[n + 1];
res[0] = 0;
res[1] = 1;
// 转移函数:res[i