卡特兰数(组合方法求解)

首先描述一个卡特兰数问题:

2n个人排队买票,其中n个人持50元,n个人持100元。每张票50元,且一人只买一张票。初始时售票处没有零钱找零。请问这2n个人一共有多少种排队顺序,不至于使售票处找不开钱?(《编程之美》4.3 买票找零)

为了将问题简单化,将持有50元的人看成1,持有100元的人看成0,这样,只要满足:在任何0位置之前,1的数目多于0的数目,就能满足要求,及合法排列,否则为不合法排列。

1、求2n个1和0的全排列数目:C(2n,n),即从2n个位置中选取n放置0(或者1)。

2、求取不满足要求的组合数(合法的组合数不好求):

        不满足要求的组合数的特点:总能找到一个位置K,使得0的数目比1的数目多1。那么很明显,k后面的0的数目比1的数目要少1.(为什么要找位置k?因为,我要让前面K个位置0、1排列不管怎么排列都不合法)

        此后,我们关注k位置后面的排列:因为k后面的排列中,明显0比1少,那么我们可以将0和1互换(为什么要互换?首先,0、1互换后,两种排列方式的总数目是不变的,其次,互换后的排列中0比1多1个,那么不管怎么排列,都不合法),这样互换后2n个数的排列不管怎么排列都不合法(值得注意的是,互换后的组合排列数目,和互换前的是相同的,因为前面的排列不变且后面排列组合方式的数目一样。)

        现在来计算互换后排列的数目:互换后排列的数目中0为n+1个,1为n-1个,那么组合数就相当于从2n个位置选取n+1个位置放0,即为C(2n,n+1)

3、卡特兰数的组合数为C(2n,n)-C(2n,n+1).

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值