有N粒药,其中有一粒为1.1g,其他均为1g。
现给一个秤,问在尽可能少的承重下的最多要称多少次来找出1.1g的药丸。
看到这一个题,我们假设1.1g的药丸为y
最初想到的就是尽可能平分成两堆,分别进行承重,然后将重量异常的一堆再平分成两堆,直到剩下最后两颗,称其中的一颗来计算称重的次数。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| [1.1] | [1.2] | [2.2] | [2.3] | [3.3] | [3.4] | [4.4] | [4.5] | |
| [1,1] | [1.1] | [1.2] | [1.2] | [2.2] | [2.2] | [2.3] | ||
| [1.1] | [1.1] | [1.1] | [1.1] | [1.2] | ||||
| [1.1] | ||||||||
| 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 4 |
所以可以得出一个公式dp[n] = 1 + dp[(n+1)/2]
这样就可以得到最后需要的结果。
但是这样我们并没有能够证明分成两堆是最优的结果。
所以我们来推到分成3堆时的结果
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| [1.1] | [1.1.1] | [1.1.2] | [1.2.2] | [2.2.2] | [2.2.3] | [2.3.3] | [3.3.3] | |
| [1.1] | [1.1] | [1.1] | [1.1.1] | [1.1.1] | [1.1.1] | |||
| 0 | 1 | 2 | 3 | 3 | 3 | 4 | 4 |
4 |
所以得到公式:dp[n] = 2+dp[(n-1)/3+1]
进而推到出当尽可能分成i份时的公式 dp[n] = (i-1) + dp[(n-1)/i+1]
接下来先证分成2份比分成3份要更优。
既1 + dp[(n-1)/2+1]<=2+dp[(n-1)/3+1]
既dp[(n-1)/2+1]<=1+dp[(n-1)/3+1]
既1 + dp[((n-1)/2+1-1)/2+1]<=1+dp[(n-1)/3+1]
既dp[(n-1)/4+1]<=dp[(n-1)/3+1]
因为dp为递增的,同时(n-1)/4<(n-1)/3 所以证明成立!
同理可证当分成i(i>2)时要比分成2份要称重的次数多。
同时根据前面的到的结果得到模拟的方程:
n = n-1
t = log(n,i)
ans = (i-1)*t+n/(i**t)
这样只要证明ans函数对于i单增即可证明分为两份为最优解。
ans = i*log(n,i) - log(n,i) + n/(i^(log(n,i)))
d(ans)/d(x) = ln(n)*(ln(x) - 1)/((ln(x))^2) + ln(n)/(x*(lnx)^2)-n/(x^(ln(n)/ln(x)))^2
经证明当x>1时ans关于i单增,所以当i为2时为最优解