该题还可以扩展,比如说给更多的球,如3个球,多少次测试可以找出楼层。
分析如下:
用动态规划解这个问题
设f(a, b)为a个球做b次测试可以测试到的楼层数,可以确定的楼层数即为f(a, b) + 1,因为第1层不需测试,需要测试的楼层号仅仅为[2, f(a, b) + 1]共f(a, b)层,也就是a个球b次测试可以测试到的楼层数。考虑第1次测试,测试的楼层记为x:
1)如果球破了,就需要测试x下面的楼层,还剩下a-1个球b-1次测试,测试的楼层数为f(a - 1, b - 1)。
2)如果球没有破,那么需要测试x上面的楼层,还剩下a个球b-1次测试,测试的楼层数为f(a, b - 1)。
a个球b次测试为1)2)测试的楼层数及第1次测试了的1层,所以:
f(a, b) = f(a - 1, b - 1) + f(a, b - 1) + 1 (1)
考虑初始条件,显然f(a, 1) = 1(a >= 1,1次测试可以测试到的楼层数当然为1,不论多少个球),f(1, b) = b(b >= 1,1个球做了b次测试当然测试到了b层楼)。
强调一下:注意f(a, b)为测试到的楼层数,f(a, b)加上不需测试的楼层才是可以确定的楼层(f(a, b) + 1)。
动态规划解(1)式即可。
一般来说,a >= 2(1个球意义不大),可以计算出f(2, 64) = 2080,f(3, 64) = 43744,f(4, 64) = 679120。
程序如下
[cpp] view plain copy
- /*
- * a balls, n floors, want to find the minimum number of floor
- * where a ball drops will be broken. output the minimum number
- * of drops
- * METHOD: dynamic programming
- * assum the answer is b, that is the number of drops
- * f(a, b): the maximum number of floors, when a balls and b drops
- * f(a, b) = 1 + f(a, b - 1) + f(a - 1, b - 1)
- * obviously, f(a, 1) = 1; f(1, b) = b
- */
- #include <stdio.h>
- #include <stdlib.h>
- #incl