N个不同球取出M个的组合个数求解
从N个不同的球中取出M个,一共有多少种取法?
这个问题是组合数据的基本问题,考虑拿出球是否放回,拿出去的球是否有序,它有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个的组合个数求解的更多相关文章
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...
- nyoj 找球号三(除了一个数个数为基数,其他为偶数,编程之美上的)
#include<iostream> #include<stdio.h> using namespace std; int main() { int len; while(ci ...
- linux grep 取出特定字符串并统计个数
原始日志如下: $more text.log 2018-07-16 00:00:03 [DEBUG] request setInformation params:{"msg":&q ...
- 1566: [NOI2009]管道取珠 - BZOJ
Description Input第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行 ...
- CF 553A 组合DP
http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...
- [SinGuLaRiTy] 组合数学
[SinGuLaRiTy-1005] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved . 加法原理 设事件A有m种产生方式,事件B有n种产生方式 ...
- codeoforces 975B Mancala
题意: 一个游戏,有14个洞,每个洞中开始有若干个球或者没有球. 每一步的操作,是将一个洞中的所有球取出,再逆时针放一个球到它的后一个洞,后两个洞,后三个洞....如果当前放的是最后一个,那么下一个又 ...
- 中式台球 规则 ( ChinaBilliards )
中式台球比赛规则 中式台球兴起于上世纪八十年代末,之前叫法有“中式8球”.“中式9球”.“十六彩”.“美式落袋”.“普尔“.”八球””等等.中国台球协会于2012年宣布统一该项运动称呼,定名为“中式台 ...
- 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit 1000 ms Memory li ...
随机推荐
- Mybatis-Generator自动生成Dao、Model、Mapping等相关映射文件(懒人版)
今天在学习mybatis生成相关的映射文件的时候,发现了往期的生成Dao.Model.Mapping等文章多数都是一样的,我也在学着重复造轮子,不过是懒人造的.本文旨在解决开发过程,简化配置文件的“手 ...
- 超薄二维Mo2C晶体
记者今天从中国科学院金属研究所获悉,该所沈阳材料科学国家(联合)实验室先进炭材料研究部任文才研究组在大尺寸高质量二维过渡族金属碳化物晶体的制备与物性研究方面取得了重要突破.相关成果日前在<自然— ...
- 唯快不破:Web应用的13个优化步骤
https://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=2651163004&idx=2&sn=2b1be8014abf19 ...
- TZOJ 1242 求出前m大的数(预处理)
描述 给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=10000)并按从大到小的顺序排列. 输入 ...
- 提交代码到远程GIT仓库,代码自动同步到远程服务器上。
现在一般都会通过github,gitlab,gitee来管理我们的代码.我们希望只要我本地push了代码,远程服务器能自动拉取git仓库的代码,进行同步. 这就需要用到各仓库为我们提供的webhook ...
- php调用window系统自带的命令,比如计算器
1.在cmd命令行输入calc.exe 2.
- [转]docker 基本原理及快速入门
版权声明:原创作品, 来自海牛部落-青牛,http://hainiubl.com/topics/13 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud ...
- 写点C++ 学习记录 充数
#include "stdafx.h" #include <cstdlib> #include <iostream> using namespace std ...
- 转载hibernate 的3种 状态 。。
转自 http://huangtut.iteye.com/blog/261520 对我有帮助,所以收藏了 Hibernate三种状态的区分,以及save,update,saveOrUpdate,m ...
- 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)
传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...