有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时为最优解

相关文章: