分球的八个问题

分球的八个问题

问题:把 m 个球放入 n 个盒子里,有多少种放法?

这题目其实条件没说清,m 球放 n 盒,可以有 8 种情况:

  1. 球同,盒同,盒不可以为空
  2. 球同,盒同,盒可以为空
  3. 球同,盒不同,盒不可以为空
  4. 球同,盒不同,盒可以为空
  5. 球不同,盒同,盒不可以为空
  6. 球不同,盒同,盒可以为空
  7. 球不同,盒不同,盒不可以为空
  8. 球不同,盒不同,盒可以为空

这 8 个问题,看起来相似,但是解法上是有不同的。我们一个一个看。

问题 8:球不同,盒不同,盒可以为空

最简单的,是问题 8:m 不同球,n 不同盒,允许空盒。

每个球都有 n 种选择,m 个球就有 n m n^m nm 种分法。

S 1 ( m , n ) = n m S1(m,n) = n^m S1(m,n)=nm

问题 2:球同,盒同,盒可以为空

问题 2:m 同球,n 同盒,允许空盒。

分情况讨论:

A,球数 (m) 少于盒子数 (n):则分配方案和 m 个球放入 m 个盒子相同。

B,球数 (m) 不少于盒子数 (n):

可以分解为两种情况:

1,至少有一个空盒子。这种情况,与去掉一个空盒子方案数相同。即: m m m 个同球放入 n − 1 n-1 n1 个同盒子,允许空盒的方案。

2,没有空盒子,所有的盒子都至少放一个球,转化为 m − n m-n mn 个球放入 n n n 个盒子的方案。

任何一种 m m m 个同球放入 n n n 个同盒的方案必然属于上述两种方案之一,既不会同时属于上述两种方案,也不会出现在这两种方案之外。

S 2 ( m , n ) = S 2 ( m , n − 1 ) + S 2 ( m − n , n ) S2(m,n) = S2(m, n-1) + S2(m-n,n) S2(m,n)=S2(m,n1)+S2(mn,n),如果 m − n < n m-n < n mn<n,则后一项为 S 2 ( m − n , m − n ) S2(m-n, m-n) S2(mn,mn)

罗奕铭的解释:

既然盒相同,我们不妨认为一个分球方案是按照球数的从小到大排列的。

等效成把一个数 m 拆成 n 个数的和,并且这 n 个数单调不降。

f ( m , n ) f(m,n) f(m,n) 为 m 拆成 n 份的方案数。

如果这么拆: x 1 + x 2 + x 3 + . . . + x n = m ( x i ≥ 0 ) x_1 + x_2 + x_3 + ... + x_n = m \quad (x_i \ge 0) x1+x2+x3+...+xn=m(xi0)

x 1 = 0 x_1 = 0 x1=0 时, x 2 . . . x n x_2 ... x_n x2...xn 的拆法可以表示成 f ( m , n − 1 ) f(m,n-1) f(m,n1)

x 1 ≥ 1 x_1 \ge 1 x11 时,上式可以变成 ( x 1 − 1 ) + ( x 2 − 1 ) + . . . + ( x m − 1 ) = m − n (x_1 - 1) + (x_2 - 1) + ... + (x_m - 1) = m-n (x11)+(x21)+...+(xm1)=mn

后面的拆法表示成 f ( m − n , n ) f(m-n,n) f(mn,n)

所以 f ( m , n ) = f ( m , n − 1 ) + f ( m − n , n ) f(m,n)=f(m,n-1)+f(m-n,n) f(m,n)=f(m,n1)+f(mn,n)

问题 1:球同,盒同,盒不可以空

问题 1:m 同球,n 同盒,无空盒。

既然 m 个球是相同的,而且没有空盒,那从所有方案的每个盒子拿走一个球,方案数不变。

每个盒子拿走一个球,问题 1 转化为 问题 2。

S 1 ( m , n ) = S 2 ( m − n , n ) S1(m,n) = S2(m-n, n) S1(m,n)=S2(mn,n)

问题 3:球同,盒不同,盒不可以空

问题 3:m 同球,n 不同盒,无空盒。

这个问题用组合数学插板法解决。

m m m 个球排成一排(只有一种方法),它们中间有 m − 1 m-1 m1 个空挡。从 m − 1 m-1 m1 个空挡中选择 n − 1 n-1 n1 个,放入插板。每个空挡最多放一个插板,就把 m 个球分成 n 部分。由于插板不相邻,所以没有空盒。

问题 3 的方法数有 S 3 ( m , n ) = C m − 1 n − 1 S3(m,n) = C_{m-1}^{n-1} S3(m,n)=Cm1n1 个。

组合数公式: C n r = P n r r ! = n ! r ! ⋅ ( n − r ) ! C_n^r = \frac{P_n^r}{r!} = \frac{n!}{r! \cdot (n-r)!} Cnr=r!Pnr=r!(nr)!n! P n m = n ! ( n − m ) ! P_n^m = \frac{n!}{(n-m)!} Pnm=(nm)!n!

问题 4:球同,盒不同,盒可以为空

问题 4:m 同球,n 不同盒,允许空盒。

问题 4 可以通过问题 3 求解。

为了避免空盒,先在每一个盒里假装放一个球,这样就有 n + m n+m n+m 个球。按照问题 3 的方法分完了之后,再从每个盒子里面取走一个球,方案数不变。

问题 4 的方法数是: S 4 ( m , n ) = S 3 ( m + n , n ) = C n + m − 1 n − 1 S4(m,n) = S3(m+n,n) = C_{n+m-1}^{n-1} S4(m,n)=S3(m+n,n)=Cn+m1n1

问题 5、6、7,先熟悉一下这个三角形:

性质1,左右两边都是1,第几行就有几个数,比如第 5 行就是 1 X X X 1

性质2, S ( N , K ) = S ( N − 1 , K − 1 ) + K × S ( N − 1 , K ) S(N, K) = S(N-1, K-1) + K \times S(N-1, K) S(N,K)=S(N1,K1)+K×S(N1,K),含义是第 N N N 排的第 K K K 个数等于 { 它上一排的左上角位置的数字 } 加 { 它上一排的同样位置数字的 K K K 倍}。

例如 S ( 7 , 3 ) S(7, 3) S(7,3) 就是第 7 排第 3 个数字,所以他等于第 6 排第 2 个数字 第 6 排第 3 个数字乘以 3。

所以第 1 排是1,第2排 1,1,第 3 排(左右两边都是1,只有中间那个数字没确定)。 所以 $S(3, 2) = $第 2 排第 1 个数字 第 2 排第 2 个数字的两倍 = 1 + 1 × 2 = 3 = 1+1 \times 2 = 3 =1+1×2=3,所以第 3 排数字就是 1,3,1。同理 $S(4, 2) = S(3, 1) + 2 \times S(3, 2) = 1+2 \times 3 = 7, … $如此类推。

问题 5,球不同,盒同,盒不可以为空

问题 5:m 不同球,n 同盒,无空盒。

假设 S 5 ( m , n ) S5(m,n) S5(m,n) 为 m 个不同的球,放入 n 个相同的盒子,盒子不可以为空的放法总数。

考虑递推关系。假设 m 个球是依次放入盒子中的,即球是按照 1 , 2 , 3 , . . . , m 1,2,3,...,m 1,2,3,...,m 的顺序放入的。显然,对于一种放法方案,我们固定一个放入顺序并不会增加或者减少方案的数目。
m m m 号球放入之前,有 m − 1 m-1 m1 个球放入 n 个盒子,方案数为 S 5 ( m − 1 , n ) S5(m-1,n) S5(m1,n)。第 m m m 号球有 n n n 种放法(放入 n 个盒子中的任意一个),因此有 n × S 5 ( m − 1 , n ) n \times S5(m-1,n) n×S5(m1,n) 种放法。

上述这种考虑,还缺一个方案,就是 m m m 号球放入的那个盒子,只有 m m m 号球。这时候,在 m 号球放入之前,是有空盒子的,这种情况不在 S 5 ( m − 1 , n ) S5(m-1,n) S5(m1,n) 表达的范围内。因为盒子是相同的,因此在 m m m 号球放入之前,只有 n − 1 n-1 n1 个非空的盒子,方案数为 S 5 ( m − 1 , n − 1 ) S5(m-1, n-1) S5(m1,n1)

综上,递推公式为: S 5 ( m , n ) = S 5 ( m − 1 , n − 1 ) + n × S 5 ( m − 1 , n ) S5(m,n) = S5(m-1,n-1) + n \times S5(m-1,n) S5(m,n)=S5(m1,n1)+n×S5(m1,n)

问题6,球不同,盒同,盒子可以为空

问题6:m 不同球,n 同盒,允许空盒(在问题 5 的基础上允许空盒)。

那就枚举空盒子的数量:一个空盒子都没有 + 有一个空盒子 + 有两个空盒子 + 有三个空盒子+ ,,,+都装在一个盒子里。

改写成公式就是: S 6 ( m , n ) = S 5 ( m , 1 ) + S 5 ( m , 2 ) + S 5 ( m , 3 ) + … + S 5 ( m , n ) S6(m,n) = S5(m, 1) + S5(m, 2) + S5(m, 3) + … + S5(m, n) S6(m,n)=S5(m,1)+S5(m,2)+S5(m,3)++S5(m,n)

也就是上面那个三角形,第 m 排开始第 1 个数字一直加到第 n 个数字。

问题 7,球不同,盒不同,盒不可以为空

问题 7:m 不同球,n 不同盒,无空盒。

问题 7 和问题 5 的区别是,盒子不同。那就先按照问题 5 分,然后把盒子全排列编号就行了。

所以问题 7 的解是: S 7 ( m , n ) = n ! × S 5 ( m , n ) S7(m,n) = n! \times S5(m, n) S7(m,n)=n!×S5(m,n)

组合数的计算方法

在讨论这些问题的,时候,需要计算组合数 C m n = m ! n ! ⋅ ( m − n ) ! C_m^n = \frac{m!}{n! \cdot (m-n)!} Cmn=n!(mn)!m!

常见的计算方法就是计算阶乘,然后除,这时候很容易溢出。

一个简单的变换是: C m n = m ! n ! ⋅ ( m − n ) ! = ( n + 1 ) ⋅ ( n + 2 ) ⋅ . . . ⋅ m ( m − n ) ! C_m^n = \frac{m!}{n! \cdot (m-n)!} = \frac{(n+1) \cdot (n+2) \cdot ... \cdot m}{(m-n)!} Cmn=n!(mn)!m!=(mn)!(n+1)(n+2)...m ,这样溢出的可能性小一些。

课上温瀚博介绍一种办法,通过递推的方法算组合数。

组合数公式的递推公式: C m n = C m − 1 n − 1 + C m − 1 n C_m^n = C_{m-1}^{n-1} + C_{m-1}^n Cmn=Cm1n1+Cm1n

等式左边表示从 m 个元素中选取 n 个元素,而等式右边表示这一个过程的另一种实现方法:
任意选择m中的某个备选元素为特殊元素,从 m 中选 n 个元素可以由此特殊元素的被包含与否分成两类情况:

即 n 个被选择元素包含了特殊元素和 n 个被选择元素不包含该特殊元素。

前者相当于从 m-1 个元素中选出 n-1 个元素的组合,即 C m − 1 n − 1 C_{m-1}^{n-1} Cm1n1;后者相当于从 m-1 个元素中选出 n 个元素的组合,即 C m − 1 n C_{m-1}^n Cm1n

问题 5 的搜索方案

问题 5:m 不同球,n 同盒,无空盒。

这个思路是魏诗然提出来的。

既然 n 个盒相同,我们不妨规定放球的时候,只能按照盒子的顺序单调不升的放。

那么,DFS 凑出每个盒子里面放球的个数,并保证 b u f [ 1 ] ≥ b u f [ 2 ] ≥ b u f [ 3 ] ≥ . . . ≥ b u f [ n ] ≥ 1 buf[1] \ge buf[2] \ge buf[3] \ge ... \ge buf[n] \ge 1 buf[1]buf[2]buf[3]...buf[n]1

例如,5 个球 3 个盒子,可以拆分为:3 1 12 2 1。注意,两个放一个球的盒子可以互换。

我们对拆分后的方案计算组合数

盒子 1 的方案数 a n s [ 1 ] = C ( m , b u f [ 1 ] ) ans[1] = C(m,buf[1]) ans[1]=C(m,buf[1])
盒子 2 的方案数 a n s [ 2 ] = C ( m − b u f [ 1 ] , b u f [ 2 ] ) ans[2] = C(m-buf[1],buf[2]) ans[2]=C(mbuf[1],buf[2])
… …
盒子 n 的方案数 a n s [ n ] = C ( m − b u f [ 1 ] − b u f [ 2 ] − . . . − b u f [ n − 1 ] , b u f [ n ] ) ans[n] = C(m-buf[1]-buf[2]-...-buf[n-1],buf[n]) ans[n]=C(mbuf[1]buf[2]...buf[n1],buf[n])

根据乘法原理,总方案数应该是上述组合数相乘。

假设有 2 个盒子的球数相同,那组合数应该除以 2 ! 2! 2!,如果有 3 个盒子的球数相同,那组合数应该除以 3 ! 3! 3!

我们假设每一种球数的盒子数量表示为: q [ i ] = j q[i]=j q[i]=j,即 2 个球的盒子有 j 个。

p = ∏ ( q [ i ] ! ) q [ i ] ≠ 0 p = \prod (q[i]!) \quad q[i] ≠ 0 p=(q[i]!)q[i]=0

a n s = a n s [ 1 ] × a n s [ 2 ] × . . . × a n s [ n ] p ans = \frac{ans[1] \times ans[2] \times ... \times ans[n]}{p} ans=pans[1]×ans[2]×...×ans[n]

ans 是一组球的放法数量的组合数。此题的结果需要把不同的放法数量加起来就可以了。

总结

输出方案数问题是信息学竞赛中的一种常考题目。

通过【分球的八个问题】,可以帮我们把组合数学的加法原理、乘法原理和动态规划的方案递推思路认真梳理一遍,对锻炼这种题目的思考方法是很有帮助的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 摘 要 I 1 概述 1 2系统总体方案及硬件设计 1 2.1 AT89C51简介 2 2.2 数码管显示原理 2 2.3 系统总体方案 3 3 编程设计 3 3.1 定时/计数器 3 3.2 程序流程图 4 3.3 程序分析 6 4 Proteus软件仿真 6 4.1 Proteus仿真软件简介 7 4.2 仿真过程 7 5 调试分析 10 6 心得体会 10 致谢 12 参考文献 13 附录一 程序清单 14 附录二 电路原理图 16 摘 要 本系统是采用单片机AT89C51作为本设计的核心元件。利用7段共阳LED作为显示器件。在 此设计中共接入了2个7段共阳LED显示器,用于记录该队的分数, 2个LED显示器显示范围可达到0~99分,基本满足赛程需要。当比赛队得1分时,按下S1键 加1分,得2分时按S2键加2分,得3分时按下S3键加3分。如分数计错需减分时,每按一次 S4键减1分。 采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。解决了篮球比 赛计数器的安装问题,节约了线材,适合在各种规模的体育场馆使用,完全可以代替传 统的用钟表进行计时的方法,当然稍加改动也可以用于其他球类比赛,是体育器材向智 能化发展的一个实例。 关键词:AT89C51 LED显示 定时/计数器 1 概述 体育比赛计分系统是对体育比赛过程中所产生的时间,比分等数据进行快速采集记录 ,加工处理,传递利用的信息系统。根据不同运动项目的不同比赛规则要,体育比赛 的计时计分系统包括测量类,评分类,命中类,制胜类得分类等多种类型。 篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的 计时系统是一种得分类型的系统。篮球比赛的计时系统由计时器等多种电子设备组成, 同时,根据目前高水平篮球比赛要,完善的篮球比赛计时系统设备应能够与现场成绩 处理,现场大屏幕,电视转播车等多种设备相联,以便实现高比赛现场感,表演娱乐观 众等功能目标。 由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低, 价格便宜,可靠性高,抗干扰能力强和使用方便等独特的优点,使单片机迅速得到了推 广应用,目前已经成为测量控制应用系统中的优选机种和新电子产品的关键部位。世界 各大电气厂家,测控技术企业,机电行业,竞相把单片机应用于产品更新,作为实现数 字化,智能化的核心部件。篮球计时计分器就是以单片机为核心的计时计分系统,由于 对于单片机是刚刚学习,对于编程也不是十分熟练,故本次设计的内容相较简单,达不 到正式比赛需,仅供学习之用。 2系统总体方案及硬件设计 2.1 AT89C51简介 单片机是在一块芯片中集成了CPU、RAM、ROM、定时/计数器和多功能I/O口等计算机所 需要的基本部件的大规模集成电路,又称MCU。 其以体积小、功能全、性价比等诸多优点而独具特色,在工业控制、尖端武器、通信 设备、家用电器等嵌入式应用领域中独占鳌头。如果说C语言程序设计课程设计的基础课 ,那么单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬 件设计基础课。其管脚图如右图所示。 图2.1AT89C51管脚图 2.2 数码管显示原理 数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。我们分别把他 命名为A,B,C,D,E,F,G,H。 图2.2 数码管内部结构图 假设我们要显示一个数字2, 那么 A、B、G、E、D这5个段的发光管亮就可以了,C、F、H不亮,同时由于接法为共阳接法, 那么为低电平是亮,为高电平是灭。从高往低排列, P1.7- P1.0写成二进制为01111110, 把他转化为16进制则为A2H。我们可以根据硬件的接线把数码管显示数字编制成一个表格 ,见下表,以后直接调用就行了。 表2.1 共阳极数码管显示 "显示 "P1.7 "P1.6 "P1.5小F "P1.4 "P1.3 " " "小数点 "G " "E "D " 表3.2 控制寄存器 TF1 "TR1 "TF0 "TRO "IE1 "IT1 "IE0 "IT0 " "T1请 有/无 "T1工作 启/停 "T0请 有/无 "T0工作 启/停 "INT1请有/无 "INT1方式下沿 "INT1请有/无 "INT1方式下沿 " "篮球比赛计分器利用单片机的计数器进行工作,计数器对外部脉冲的下降沿进行加1计 数,直至计满回零。作为可编程器件,单片机中的定时/计数器初始化编程步骤如下 : 根据定时时间要或计数要计算计数器初值; 将工作方式控制字写入TMOD寄存器; 将计数初值写入THX和TLX寄存器; 启动定时器/计数器,即将TRX置位。 如果工作于中断方式,需置位EA(中断总开关)及ETX(允许定时/计数器中断),并 编写中断服务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值