如何直观地理解排列数和组合数

如果要问我高中时学文科有什么不好,我觉得,最不好的一点就是在你上概率论课时,你听着老师讲的内容一脸蒙蔽,而其他同学纷纷表示自己高中时就已经学过了。之前做题遇到排列数与组合数都是直接写A和C,并不进行计算,所以对于其公式也只是记住能用就好,但是今天闲着无聊,想试着推导一下排列数和组合数的公式,也为了能深入理解排列数和组合数的原理,所以就开始了天马行空的想象。

对于排列数,可以视为“分步解决”的问题,也就是说:

第一步,从n个某物中选取1个,有n种选择方法;

第二步,从剩下的n-1个某物中选取1个,有n-1种选择方法;

第三步,从剩下的n-2个某物中选取1个,有n-2种选择方法;

……

第k步,从剩下的n-k+1个某物中选取1个,有n-k+1种选择方法;

那么这k个步骤结合到一起,就有 种选择方法,也可以表示成,也就是标准的排列数公式。

对于组合数,我们只需要去除所有排列中元素相同的排列,使每种元素相同的排列组只剩下一个排列即可,所以,最关键的问题也就在于确定其中每种元素相同的排列组所包含的排列的个数。会产生个排列,其中,对于任意排列都有个相同元素的排列存在,所以,每一个元素相同的排列组里包含个排列,个排列可以分为个元素相同的排列组,也就是说,从n个元素里选取k个元素组成一个组合,其选取方法总共有种。

时间: 2024-10-07 05:16:01

如何直观地理解排列数和组合数的相关文章

SCU 4424(求子集排列数)

A - A Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SCU 4424 Description Time Limit: 1000ms Description Given N distinct elements, how many permutations we can get from all the possible subset of the eleme

C语言 · 排列数

算法提高 排列数 时间限制:1.0s   内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456789). 输入格式 一行,包含一个整数n 输出格式 一行,包含一组10个数字的全排列 样例输入 1 样例输出 0123456789 数据规模和约定 0 < n <= 10! 1 #include<stdio.h> 2 #includ

hdoj 2049 不容易系列之(4)——考新郎 【全错位排列】【组合数】

方法如题. 全错位排列 不容易系列之(4)--考新郎 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21347    Accepted Submission(s): 7857 Problem Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎

第k个排列数

变长编码,这里排列的序号是0到n!-1,假设求 1,2,3,4 的第15个排列数,15/(3!) = 2, 余数是3,第一个数是(1,2,3,4)中的第二个数 3 (这里0是开始位置),3/(2!) = 1, 余数是1,第二个数就是(1,2,4)中的第一个数 2,  1/(1!) = 1, 余数是0,第三个数(1,4)中的第1个数就是4, 最后一个数就是1.结果就是3,2,4,1 #include <cstdio>#include <cstring>#include <vec

C语言 &#183; 排列数 &#183; 排列式

蓝桥练习场上不断碰到类似的题,都是一个递归搜索的套路. 算法提高 排列数 时间限制:1.0s   内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456789). 输入格式 一行,包含一个整数n 输出格式 一行,包含一组10个数字的全排列 样例输入 1 样例输出 0123456789 数据规模和约定 0 < n <= 10! 作者注释:标准

46. Permutations 排列数

46. Permutations 题目 Given a collection of distinct numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解析 class Solution_46 { public: void help(int

递归基础—组合数 / 排列数—输出的各种办法(dfs/递归/bfs)

B: 部分和问题***(注意部分和 ! = 任意子区间求和不一样) 描述   给你N个数,问你能不能从其中取出一些,让它们的和为K. 输入 第一行包括两个数,N,K,分别代表数字个数,以及和为K. 接下来N行,每行一个数字. 输出 如果能选出一些数和为K, 输出YE5,  否则,输出N0 样例 输入: 4 0 1 -1  2  3 输出: YE5 输入: 2 2 1 -3 输出: N0 本题求组合数和,注意pe之外,思维比较基础,办法很多,以下为利用dfs思想实现的一种办法 如果求组合数输出各种

题(liu_runda的神题)(卡特兰数,组合数)

考场的SB经验不再分享 case 0: 一道组合计数的水题,具体不再讲可以看以前的相似题 case 1: 很明显的卡特兰计数,我们把长度为n的序列看成01串 由此可知我们需要满足从1——n中前缀1的数量不少于前缀0的数量 case 2: 满足可以在坐标轴上移动 设f[i]表示第i步回到原点,我们枚举第j步第一次回到起点 那么f[i]数组里就不会出现重复,这样可以保证正确性 同时要再次用到卡特兰数:    我们发现定义的特殊j是第一次回到起点,但cal中可以多次回到起点 但我们可以发现只要我们满足

【题解】Luogu P4317 花神的数论题 组合数

前言 今天实在是太冷了!!! o(*////▽////*)q 导致我这个菜鸡硬生生把一道数位dp写成了组合数水过(还不是因为数位dp题解没看懂 显然题意都告诉你了,$sum(i)$表示二进制位下的几个一,可以想到组合意义,在一个$i$位的二进制数中填$j$个1的方案数 预处理个50*50的杨辉三角,完全不需要求线性逆元 最后快速幂累乘出答案即可 code 1 #include <bits/stdc++.h> 2 using namespace std; 3 namespace gengyf{