排列组合常见解题方法

27 October in ss 中的一道题阐发:

拓展:把 \(n\) 个相同物品放入 \(m\) 个篮子, 若

(1) 篮子可以为空, 篮子不同:共有 \(C_{n+m-1}^{m-1}\) 种方案.

(2) 篮子不可以为空, 篮子不同:共有 \(C_{n-1}^{m-1}\) 种方案. (挡板法)

(3) 篮子可以为空, 篮子相同:方案递推式为 \(f(n,m)=f(n-1,m)+f(n,m-1)\).

(4) 篮子不可以为空, 篮子相同:方案算式为 \(f'(n,m)=f(n-m,m)\).

推广:记 \(Q(n,m)\) 为把自然数 \(n\) 拆分为 \(m\) 个无序的自然数的方案数.

\[\displaystyle Q(n,m)=\begin{cases} 1,& m=1\text{ or } n=1,\\ Q(n,n),& m>n,\\ 1+Q(n,n-1),& m=n,\\ Q(n,m-1)+Q(n-m,m),& m<n. \end{cases} \]

排列组合题的常见解题方法:捆绑法、插空法、分组法、挡板法、优限法、倍缩法、间接法.

捆绑法——解相邻问题

例1:(1) 求 7 的排列中偶数必相邻的排列种数. (2) 求 7 的排列中偶数互不相邻的排列种数.

对于 (1), 因为偶数必相邻, 所以把偶数 “捆绑” 为一个整体, 与 1, 3, 5, 7 排序, 有 \(A_5^5\) 种排法;偶数 “捆绑” 的内部, 有 \(A_3^3\) 种排法. 根据乘法原理, 共有 \(A_5^5\cdot A_3^3=720\) 种排法.

对于 (2), 先对奇数排序, 共 \(A_4^4\) 种排法;将 2, 4, 6 插入 1, 3, 5, 7 之间, 有 5 个间隙, 有 \(A_5^3\) 种 “插入” 方法. 根据乘法原理, 共有 \(A_4^4\cdot A_5^3=1440\) 种排法.

\(n\) 个不同元素必须相邻, 有 \(A_n^n\) 种 “捆绑” 方法.

\(n\) 个不同元素互不相邻, “插入” \(m\) 个间隙中, 有 \(A_m^n\) 种 “插入” 方法.

插空法——解不相邻问题

例2:6个不同物品放在九个相同容器里, 每个容器只能放入最多一个物品, 每个空容器两边都有物品, 求方案数.

6 个不同物品有 \(A_6^6\) 种不同的顺序;把 3 个相同空容器 “插入” 到 6 个人当中的 5 个 “空隙”, 有 \(C_5^3\) 种方法. 根据乘法原理, 共有 \(A_6^6\cdot C_5^3=7200\) 种方案.

\(n\) 个相同元素互不相邻, “插入” \(m\) 个间隙中, 有 \(C_m^n\) 种 “插入” 方法.

分组法——解不同元素分组问题

例3:求将 1, 2, 3, 4, 5, 6 分为 3 组的分组方法.

分类讨论:

第一类 (1-1-4) 分法(整体等分, 局部不等分):(法1) 6 取 4 “捆绑”, 得 \(C_6^4=15\). (法2) 先取 1 个为 \(C_6^1\);再取 1 个为 \(C_5^1\), 两次选取无先后之分, 所以再除以 \(A_2^2\);剩下 4 个自成一组. 得 \(\displaystyle \frac{C_6^1\cdot C_5^1}{A_2^2}=15\).

第二类 (1-2-3) 分法(整体和局部均不等分):6 取 1 为 \(C_6^1\);5 取 2 为 \(C_5^2\);余下自成一组. 得 \(C_6^1\cdot C_5^2=60\).

第三类 (2-2-2) 分法(整体和局部均等分):6 取 2 为 \(C_6^2\);4 取 2 为 \(C_4^2\), 两次选取无先后之分, 所以再除以 \(A_2^2\);剩下 2 个元素自成一组. 得 \(\displaystyle \frac{C_6^2\cdot C_4^2}{A_2^2}=15\).

根据加法原理, 共有 \(15+60+15=90\) 种不同的分法.

若干不同元素等份为 \(n\) 组, 要对每一个组求组合数, 乘积再除以 \(A_n^n\).

挡板法——解相同元素分组问题

例4:将 8 个相同物品放入 3 个不同容器, 每个容器至少放一个物品, 求方案数.

将 8 个物品放在一起, 插入 7 个 “挡板”:〇|〇|〇|〇|〇|〇|〇|〇. 任意保留 2 个 “挡板” 即可, 为 \(C_7^2=21\).

\(n\) 个相同元素分为 \(m\) 组, 有 \(C_{n-1}^{m-1}\) 种 “插挡板” 方法.

优限法——解含特殊条件问题

例5:7 个元素排列, 其中两个元素 A, B 特殊, (1) 求 A, B 只能放在两端的排法. (2) 求 A, B 不能放在两端的排法.

对于 (1), A, B 放在两端有 \(A_2^2\) 种;余下 5 个元素有 \(A_5^5\) 种. 根据加法原理, 有 \(A_2^2\cdot A_5^5=240\) 种排列方法.

对于 (2), 除去 A, B 的其余 5 个元素放在两端有 \(A_5^2\) 种;余下 5 个元素(含 A, B)有 \(A_5^5\) 种. 根据加法原理, 有 \(A_5^2\cdot A_5^5=2400\) 种排列方法.

对于含特殊条件的问题, 优先处理特殊条件, 称为优限法.

倍缩法——解方案有重问题

先按照一个方法, 计算出来的排列数或组合数, 是每一种排列或组合都重复了相同次数统计出来的, 这时只需把所计算出来的数字除以重复的次数, 即可得到要求的排列数或组合数, 这种解析排列组合应用题的方法即为倍缩法.

间接法——解正向求解不显然问题

对于正向求解不显然的问题, 可以考虑反向求解, 用总方案扣除不符合要求的方案. 注意不要多扣、不要少扣.


参考文献:

  1. 李苏勇. 用捆绑、插空、分组、挡板法解排列组合题[J]. 吕梁教育学院学报, 2008, 25(4): 67-68.
  2. Yogurshinem. m个苹果放入n个篮子. 博客园. https://www.cnblogs.com/Yogurshine/p/3829477.html

原文地址:https://www.cnblogs.com/greyqz/p/9867098.html

时间: 2024-09-30 21:29:44

排列组合常见解题方法的相关文章

leetCode 47.Permutations II (排列组合II) 解题思路和方法

Permutations II Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [1,1,2], [1,2,1], and [2,1,1]. 思路:这题相比于上一题,是去除了反复项. 代码上与上题略有区别.详细代码例如以下

输入N个数,输出所有可能的排列组合(6+个小时啊,耶稣~)

输入N个数,输出所有可能的排列组合 一行代码一行泪...手都被发热的笔记本烤的不舒服了....6个多小时过去鸟...终于粗来鸟.... 昨天同学问到一个排列组合的问题,本身不会很难,原题是固定输入4个数字,例如1 2 3 4,输出所有可能的排列组合 暴力的话应该不难的.代码+debug,半个小时. 如果是输入N个数字呢? 先说简单的暴力方法,如果输入4个数字,输出所有的排列组合 代码比较短,也比较简单,没有很刻意的去把代码的风格写的好一点,所以数字常量什么的表介意.... /**********

leetCode 60.Permutation Sequence (排列序列) 解题思路和方法

The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, for n = 3): "123" "132" "213" "231" "312" "

编写一个方法,确定某字符串的所有排列组合

public static ArrayList<String> getPerms(String str) { if(str==null) return null; ArrayList<String> permutations=new ArrayList<String>(); if(str.length()==0)//终止条件 { permutations.add(""); return permutations; } char first=str.c

leetcode-Combinations 复习复习排列组合

Combinations 题意: 根据给定的n和k,生成从1到n范围内长度为k的排列组合 示例: n=4 k=2 [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]] 解题: 正常情况下我们通常想到的都是通过使用递归,以枚举的形式来生成组合.先从给定的范围中拿一个数出来,把它同剩下的每一个数进行组合,然后再在每个组合上对不存在于组合的每个数进行合并,这样依次

HDU ACM 4465 Candy-&gt;概率-数学期望-排列组合

题意:有两个箱子,里面各放有糖n个,每天从两个之中任取一颗糖,突然有一天小孩取糖时发现一个盒子里空了,问另一个盒子里面现在有多少糖(求期望值)? #include<iostream> #include<cmath> using namespace std; double F[400008]; double C_N_M(int n,int m) { return F[n]-F[m]-F[n-m]; } void Init() { int i; F[0]=0; for(i=1;i<

测试用例的几种常见设计方法

测试用例常见的设计方法有:等价类划分法.边界值分析法.错误推测法.判定表法.正交实验法. 一.等价类划分法 顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,他们的并集是全集,从每个子集选出若干个有代表性的值作为测试用例. 例如,我们要测试一个用户名是否合法,用户名的定义为:8位数字组成的字符. 我们可以先划分子集:空用户名,1-7位数字,8位数字,9位或以上数字,非数字. 然后从每个子集选出若干个有代表性的值: 空用户名:""       (无效等价类实例,指对于软件规

迷人的算法-排列组合

需求 最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应,由于不确定怎么组合,就需要将所有的组合都列出来进行尝试. 抽象一下就是从一个集合中取出任意元素,形成唯一的组合.如 [a,b,c] 可组合为 [a].[b].[c].[ab].[bc].[ac].[abc]. 要求如下: 组合内的元素数大于 0 小于等于 数组大小: 组合内不能有重复元素,如 [aab] 是不符合要求的组合: 组合内元素的位置随意,即 [ab] 和 [ba

GRE数学老大难:排列组合!

一般来说, 排列组合 = 难题.每每遇上这种类型的题目, 大家就会八仙过海各显神通:在纸上穷举的,掰手指头的, 还有放弃挣扎依靠玄学的…这些方法并非不能带你找到正确答案(真的吗), 只是往往你做完这道题之后….Section时间结束了...170再见 其实出题套路千变万化, 考点万变不离其宗.那么今天我们就来看看排列组合的常见题目类型吧! 类型1 你以为我考的是排列 其实我考的是排列+组合 这类型的题往往设计到“嵌套”的概念:在一组样本里面挑选完之后, 往往又附带有其他的规则. 比如下面这道例题