Technorati 标签: 组合,概率

从N个不同的球中取出M个,一共有多少种取法?

这个问题是组合数据的基本问题,考虑拿出球是否放回,拿出去的球是否有序,它有4种变体:

  1. 不放回,有序;
  2. 不放回,无序;
  3. 放回,无序;
  4. 放回,有序;

对于第一种,取出M个球,第一个有N种可能,第二个N-1种可能,依次类推,M个球共有:

N*(N-1)*(N-2)*..*(N-M+1),

举个例子:3个同学(A,B,C),从中取出2位同学,那么可能的组合是:

A B
C
B A
C
C A
B

共计6种,刚好是3*(3-2+1)=6种。

--------------

接着看第二种,不放回,无序。由于是无序的,那么上面(无放回有序)的排列显然存在重复,重复的次数正好等于M的全排列。因此它的组合数等于:

N*…*(N-M+1) / (M*(M-1)*…*1)

如果用推理计算的方式,我们可以得到一个递归式子:

f(n,m) = f(n-1,m)+f(n-1,m-1),表示如果包含头元素f(n-1,m-1)种,不包含则为f(n-1,m)种。

--------------

第三种,有放回,有序。由于是有序的,M个球,第一个有N种可能,第二个球也有N种可能,。。。。依次类推,因此共有N*N*。。。*N,共M个N相乘。

举个例子,3个球A,B,C,取出2个,那么可能的组合是:

A A
B
C
B A
B
C
C A
B
C

--------------

第四种,有放回,无序,是这里面最麻烦的一种。最直观的做法,是和“无放回”的对应的,类比它们的做法,在结果(3)上除以一个因子:M的全排列。但是这里略有区别,因为在“无放回”的例子中,取出的球是不同的,因此不同的排列是M的阶乘;但是在本case中,取出的球是有重复的,再除以M!就不对了。举个例子,3个球取2个,有放回,无序:

A A
B
C
B B
C
C C

显然是6种,并不是3*3/2种,后者竟然不是个整数。

那么正确的建模方式是什么呢?

首先:把M次取出球当成是M个标签(相同的标签,因为是无序的),把这些标签贴到任意的球上,都贴在一个球上也没有关系。

然后:把每个球当成是一个盒子,标签当成是盒子里的球

最后:把盒子一个挨着一个排成一列,如下图所示:“-”代表盒子的底部,“|”代表盒子的壁。

|-|-|-|

一种可能的结果是:|o|o|-|,表示A,B被拿出;那么|oo||-|则表示A被拿出2次;

更一般的,可以得出不同的组合数等于:内壁的个数(N-1)+标签个数(M) 个位置中选出M个用于标签。这显然是无放回无序的问题,也就是C(N-1+M,M)。

验算一下,设N=3,M=2,则C(4,2)=6。和结果一致。

N个不同球取出M个的组合个数求解的更多相关文章

  1. PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?

    首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...

  2. nyoj 找球号三(除了一个数个数为基数,其他为偶数,编程之美上的)

    #include<iostream> #include<stdio.h> using namespace std; int main() { int len; while(ci ...

  3. linux grep 取出特定字符串并统计个数

    原始日志如下: $more text.log 2018-07-16 00:00:03 [DEBUG] request setInformation params:{"msg":&q ...

  4. 1566: [NOI2009]管道取珠 - BZOJ

    Description Input第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行 ...

  5. CF 553A 组合DP

    http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...

  6. [SinGuLaRiTy] 组合数学

    [SinGuLaRiTy-1005] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved . 加法原理 设事件A有m种产生方式,事件B有n种产生方式 ...

  7. codeoforces 975B Mancala

    题意: 一个游戏,有14个洞,每个洞中开始有若干个球或者没有球. 每一步的操作,是将一个洞中的所有球取出,再逆时针放一个球到它的后一个洞,后两个洞,后三个洞....如果当前放的是最后一个,那么下一个又 ...

  8. 中式台球 规则 ( ChinaBilliards )

    中式台球比赛规则 中式台球兴起于上世纪八十年代末,之前叫法有“中式8球”.“中式9球”.“十六彩”.“美式落袋”.“普尔“.”八球””等等.中国台球协会于2012年宣布统一该项运动称呼,定名为“中式台 ...

  9. 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory li ...

随机推荐

  1. PIE结对项目编程

    一.题目描述 构造程序并测试,分别是:     1.不能触发Fault.     2.触发Fault,但是不能触发Error.     3.触发Error,但是不能产生Failure. 二.结对对象 ...

  2. Pie(浮点数二分)

    Pie http://poj.org/problem?id=3122 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2454 ...

  3. TIME_WAIT状态的作用

    TIME_WAIT状态: 主动关闭的那端最后经历的状态,一般为2MSL秒(1~4分钟). 两个原因: 保证当最后一个ack丢失后,能收到对端重传的fin包. 保证ack包消失,不会影响下一个连接. 关 ...

  4. sublime Text与python3的中文编码错误解决办法

    在 linux服务器上运行代码报错: Python3中遇到UnicodeEncodeError: ‘ascii’ codec can’t encode characters in ordinal no ...

  5. phython学习

    Python 中文学习大本营 关于作者 赞助本站 The Python Tutorial (Python 2.7.X) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教 ...

  6. Apache模块开发

    一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...

  7. SSH登录到远程linux机器并执行命令

    一. 1.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成 ...

  8. 761A Dasha and Stairs

    A. Dasha and Stairs time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. 20172325 2017-2018-2 《Java程序设计》第八周学习总结

    20172325 2017-2018-2 <Java程序设计>第八周学习总结 教材学习内容总结 1.关于绑定 绑定:在执行程序时产生一个请求事件,需要执行一段代码来来完成方法调用,即一个方 ...

  10. [Jenkins] 在Jenkins执行单个test suite

    cd %WORKSPACE%cmd /c call "%READYAPI_PRO_190%\bin\testrunner.bat" -a -j -s"%TestSuite ...