zoukankan      html  css  js  c++  java
  • 算法分析——N个苹果放在N个盘子里的问题

    问题的描述:现在有N个一模一样的苹果,要放在编号为1、2、3……、N的盘子里(假设盘子足够大,能放下所有的苹果),问一共有多少种放法?

    算法分析:

    用符号F(i,j)表示i个苹果放在j个盘子里的放法数

    如果1号盘子里没有苹果,则i个苹果要放在剩余的j-1个盘子里

    如果1号盘里有1个苹果,则剩余的i-1个苹果放在剩余的j-1个盘子里

    如果1号盘里有2个苹果,则剩余的i-2个苹果放在剩余的j-1个盘子里

    以此类推

    如果1号盘里有i-1个苹果,则剩下的1个苹果放在j-1个盘子里

    如果1号盘里有i个苹果,则剩下的j-1个盘子里没有苹果

    于是得到以下的关系式

    F(i,j)=F(i,j-1)+F(i-1,j-1)+F(i-2,j-1)+……+F(1,j-1)+F(0,j-1)

    由上面的式子可以得出

    F(i-1,j)=F(i-1,j-1)+F(i-2,j-1)+……+F(1,j-1)+F(0,j-1)

    回代到①可知

    F(i,j)=F(i,j-1)+F(i-1,j)

    另由定义可知,

    F(i,1)=1

    F(1,i)=i

    根据式子③④⑤,推测F(i,j)的计算公式为

    F(i,j)=C(i,i+j-1) 注:C(M,N)表示组合数,表示N个里面选M的个数。组合数的计算公式这里不描述了

    下面用数学归纳法证明式子⑥的正确性

    证明:

    F(i,1)=C(i,i+1-1)=C(i,i)=1 式子④满足式子⑥

    F(1,i)=C(1,1+i-1)=C(1,i)=i 式子⑤满足式子⑥

    假设F(i,j-1)、F(i-1,j)满足式子⑥

    F(i,j-1)=C(i,i+j-1-1)=C(i,i+j-2)

    F(i-1,j)=C(i-1,i-1+j-1)=C(i-1,i+j-2)

    则由式子③可知

    F(i,j)=F(i,j-1)+F(i-1,j)=C(i,i+j-2)+C(i-1,i+j-2)=C(i,i+j-1) 满足式子⑥

    由此证明式子⑥的正确性

    故计算公式为

    F(i,j)=C(i,i+j-1)

    那么

    3个苹果放在3个盘子里的放法数为F(3,3)=C(3,3+3-1)=C(3,5)=10

    2个苹果放在4个盘子里的放法数为F(2,4)=C(2,2+4-1)=C(2,5)=10

    7个苹果放在7个盘子里的放法数为F(7,7)=C(7,7+7-1)=C(7,13)=1716

    10个苹果放在10个盘子里的放法数为F(10,10)=C(10,10+10-1)=C(10,19)=92378

    N个苹果放在N个盘子里的放法数为F(N,N)=C(N,2N-1)

  • 相关阅读:
    ASP.NET备份还原数据库
    ASP.NET的运行原理与运行机制
    Asp.net WebPages框架运行原理浅析(转)
    不要盲目选择定时器
    C# 如何用计时器Timer控件实现停留几秒再做切换窗体的操作
    使用System.Timers.Timer类实现程序定时执行
    C#启动一个外部程序(1)-WinExec
    几种类型的db,以及最新的db排名,看一下
    SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案
    Java可视化编程,基于布局管理器的UI设计
  • 原文地址:https://www.cnblogs.com/grenet/p/2777200.html
Copyright © 2011-2022 走看看