上次我们讲到,我们的主人公丁丁由于用动态规划法解决了鸡蛋掉落问题(egg dropping problem)而获得了当地科学家的赏识。这不,正当丁丁还沉浸在解决问题的喜悦中,科学家又给丁丁出了一个难题:
假设有n个鸡蛋和d次尝试机会,那么,最多能探索多少层楼?
这无疑是鸡蛋问题的翻版,因为这两个问题实在太像了。丁丁没有犹豫,立马按照之前的想法开始思考:
用$f(d, n)$表示该问题的解。假设从k层楼扔下鸡蛋(k足够大),若鸡蛋碎了,则剩下n-1个鸡蛋,d-1次尝试机会,最多能向下探索$f(d-1, n-1)$层楼;若鸡蛋没碎,则剩下n个鸡蛋,d-1次尝试机会,最多能向上探索$f(d-1, n)$层楼,于是:
$$ f(d, n)=1+f(d-1, n-1)+f(d-1,n).$$ 令$g(d, n)=f(d, n+1)-f(d,n)$,则: $${\displaystyle {\begin{aligned} g(d, n)&=f(d, n+1)-f(d,n)\\ &=[1+f(d-1,n)+f(d-1,n+1)]-[1+f(d-1,n-1)+f(d-1,n)]\\ &=[f(d-1, n+1)-f(d-1,n)]+[f(d-1,n)-f(d-1,n-1)]\\ &=g(d-1, n)+g(d-1,n-1)\end{aligned}}} $$
因为$f(0,n)=f(d,0)=0$,对于任意的$n,d$,且$f(d,1)=d$,故$g(0,n)=0, g(d,0)=d.$因为在组合数学中,有:
$$C_n^{k}=C_{n-1}^k+C_{n-1}^{k-1},$$
因此,由数学归纳法可知:$g(d,n)=C_{d}^{n+1}.$当$n+1\geq d$时,$C_{d}^{n+1}=0.$对于$f(d,n)$,有:
$$ {\displaystyle {\begin{aligned} f(d,n)=&[f(d,n)-f(d,n-1)]\\ +&[f(d,n-1)-f(d,n-2)]\\ +&\cdots \\ +&[f(d,1)-f(d,0)] \\ +&f(d,0). \end{aligned}}} $$
因为$f(d,0)=0$,因此$f(d,n)=\sum\limits_{i=1}^{n}C_{d}^{i}, d\geq 1.$于是,科学家的问题就解决了。
突然,丁丁又想到了:能不能用这个结果来解决鸡蛋掉落问题呢?答案是肯定的,对于给定的$k=f(d,n)$,只需要对d从1开始算起,得到d,恰好使得$f(d,n)\geq k,$则d即可鸡蛋掉落问题的解。
科学家看了丁丁的解答,十分满意,他终于下定决心招丁丁为自己的助手。不过,丁丁说,他还要去外面的世界再看看,因此,科学家也没有挽留,但他祝愿丁丁好运。
本文不再给出相关的程序,读者可以自己实现哦~~
本文的参考文献为:https://brilliant.org/wiki/eg... 。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。