一些简单的排列组合问题

排列及计算公式

从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号

A(n,m)表示或

【P(n,m)】表示。

A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(当n=m时,上述式子分母为0!=1).

组合及计算公式

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号

C(n,m) 表示。(C即Combination).

C(n,m)=A(n,m)/m!=n!/((n-m)!*m!);C(n,m)=C(n,n-m);            ----摘自百度百科

例1:传送门

例2:将n个相同的球放到m个不同的袋子里有几种方案?

分析:假设m=3,n=2,我们可以这么放(*代表求,空白区域代表袋子): *|  |*,还可以这么放: |**| ,还可以这么放:| |**......这样的话就有m-1个隔板(|)和n个球需要放置在n+m-1个位置中,考虑放置隔板的方案数为C(n+m-1,m-1),考虑求的方案数为C(n+m-1,n),那么答案为C(n+m-1,m-1) = C(n+m-1,n).

例3:将n个不同的球放到m个不同的袋子里有几种方案?

分析:第一个袋子可以放n种球,第二个袋子可以放n-1种球......第m个袋子可以放n-m种球,答案为n*(n-1)*...*(n-m).这样分析有点麻烦,因为每一种球都是不一样的,每一种球都只能放进1个袋子里,而每一种袋子则不一样,可以装下n种球。所以我们对球进行分析:第一个球可以放m个袋子里,第二个球可以放m个袋子里,...,第n个球可以放m个袋子里,答案为m^n.

例4:将n个不同的球放到m个相同的袋子里有几种方案?

分析:袋子相同就没办法用数学公式推导了,考虑dp.令f[i][j]表示前i个球放在j个袋子里的方案数。考虑第i个球怎么放,如果第i个球占用了一个新的袋子,那么f[i][j] += f[i-1][j-1]就好了。如果没有呢?那么这个球就能放到j个袋子里,即f[i][j] += f[i-1][j] * j,合并一下f[i][j] = f[i-1][j-1] + f[i-1][j] * j.答案是f[n][1] + f[n][2] + ...+ f[n][m]

例5:将n个相同的球放到m个相同的袋子里有几种方案?

分析:球相同,袋子也相同,这要怎么计数啊QAQ,要既不多也不少的计数,肯定是有某一种顺序,我们按照每个袋子装球的数量降序排列,这就相当于把相同的袋子强行当成了不同的袋子,为了维护这个降序,我们一旦在第i个袋子放一个球,那么前面的袋子都必须要放一个球,当然,我们也可以考虑不在这个位置多放一个球,我们在后面的袋子放,所以f[i][j] = f[i-j][j] + f[i][j-1].这道题和上一道题有一个很大的区别,上一道题的状态转移方程没有考虑不放的情况,是因为袋子是相同的,放在这个袋子和那个袋子是没有区别的,我们硬性规定第i个球必须放在我们选定的j个袋子中,而这一题虽然题面上说袋子相同,但是我们硬性规定是不同的,所以可以考虑不放的情况。

总结:这四道题可以得出一个规律:袋子不同用数学,袋子相同用dp,不同和相同的区别在于,不同的话我们可以单独考虑第i个,相同的话必须要变成“不同”的才能单独考虑!

时间: 2024-07-31 09:11:02

一些简单的排列组合问题的相关文章

简单的排列组合-使用枚举

有五种颜色,每次取出三种,要求颜色无重复 1 #include<stdio.h> 2 3 int main(void) 4 { 5 enum color{blue,red,yellow,purple,black}; 6 enum color i,j,k,pri; 7 8 int n,loop; 9 n=0; 10 11 for(i=blue;i<=black;++i) 12 { 13 for(j=blue;j<=black;++j) 14 { 15 if(i!=j) 16 { 17

js 排列 组合 的一个简单例子

最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比如12的全排列,首先把1拿出来放到elementCur,再获取由1组成的数组[2],然后在循环把1插入到0,1的位置后再返回1,2][2,1] 如果是123那么首先获取23的全排列[2,3][3,2],然后在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1]

UVA 12712 Pattern Locker(简单排列组合数学题)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4450 不懂取模运算的请猛戳:http://baike.baidu.com/link?url=A86lTLorv-Mim9g6v8EW3mY98qLz10cot1UCt6TZNPDJyslVYS5Ya1K

排列组合问题之圆形分布

1.问题1.1 团团坐有一张圆桌,坐了A,B,C,D四个人,已知,D在A的右边,C在D的对面,请问A,B,C,D,的坐次? 解答:这个问题相对简单,我们纸上画一画,就能画出他们的可能的位置了 但是,可能还有一种解,比如我们把A,B,C,D依次右转一个位,也是满足条件的,而且只要保持他们的相对位置不变,依次右转n个位都是问题的解,而且还有个有趣的事情,当他们转了一圈(即右转4个位)后,他们右回到原位了 2.圆形分布上面这个问题就是一种圆形分布,那么他和直线分布的区别在哪里呢?又有什么联系呢?上面文

python 实现排列组合

1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__='dragon' import itertools list1 = [1,2,3,4,5] list2 = [] for i in range(1,len(list1)+1): iter = itertools.combinations(list1,i) list2.append(list(ite

SPOJ - AMR11H Array Diversity (水题排列组合或容斥)

题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目就好. 求子集可以用排列组合解决,很简单,假设最大值个数是 n,最小值的数是 m,总数是 N,答案就是 (2^n-1) * (2^m-1)*2^(N-m-n), 当然要特殊判断最大值和最小值相等的时候. 当然也可以用容斥来求,就是总数 - 不是最大值的数目 - 不是最小值的数目 + 不是最大值也不是

UVa 12712 &amp;&amp; UVaLive 6653 Pattern Locker (排列组合)

题意:给定 一个n * n 的宫格,就是图案解锁,然后问你在区间 [l, r] 内的所有的个数进行组合,有多少种. 析:本来以为是数位DP,后来仔细一想是排列组合,因为怎么组合都行,不用考虑实际要考虑的比如 要连13,必须经过2,这个可以不用. 所以这题就是A(n,m).剩下的就简单了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <s

LA 7360 Run Step (排列组合,枚举)

题意:给定一个数 n ,表示一共有 n 步,然后你可以迈一步也可以迈两步,但是左腿和右腿的一步和两步数要一样,并且两步数不小于一步数,问你有多少种方式. 析:虽然是排列组合,但还是不会做.....水啊. 思路是先分开算,先算左腿的,再算右腿的,对左腿先枚举2步的,然后再算一步的,主要是这个怎么算,我就迷茫了,.... 其实并不难,我们先假设左腿有 i 个1步的和 j 个两步的,那么组合数有多少呢?很明显么,就是C(i+j, i)么,就是找 i 位置给 i. 那么剩下的就简单了. 代码如下: #p

【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.