zoukankan      html  css  js  c++  java
  • 动态规划法(七)鸡蛋掉落问题(二)

      上次我们讲到,我们的主人公丁丁由于用动态规划法解决了鸡蛋掉落问题(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 {egin{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+1geq d)时,(C_{d}^{n+1}=0.)对于(f(d,n)),有:

    [{displaystyle {egin{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)=sumlimits_{i=1}^{n}C_{d}^{i}, dgeq 1.)于是,科学家的问题就解决了。
      突然,丁丁又想到了:能不能用这个结果来解决鸡蛋掉落问题呢?答案是肯定的,对于给定的(k=f(d,n)),只需要对d从1开始算起,得到d,恰好使得(f(d,n)geq k,)则d即可鸡蛋掉落问题的解。
      科学家看了丁丁的解答,十分满意,他终于下定决心招丁丁为自己的助手。不过,丁丁说,他还要去外面的世界再看看,因此,科学家也没有挽留,但他祝愿丁丁好运。
      本文不再给出相关的程序,读者可以自己实现哦~~
      本文的参考文献为:https://brilliant.org/wiki/egg-dropping/
    注意:本人现已开通两个微信公众号: 用Python做数学(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

  • 相关阅读:
    JAVA-类加载机制(2)-类加载的过程
    JAVA-类加载机制(1)-生命周期
    StarUML-详解
    JMS-mq-发布/订阅
    JMS-mq-点对点
    Spring-Transcation
    Session-Hibernate
    Session
    Git配置
    Maven配置
  • 原文地址:https://www.cnblogs.com/jclian91/p/9146602.html
Copyright © 2011-2022 走看看