8
排列与组合
GESP 八级 · 知识点 2

🎪 排列与组合

「5 个人选 3 个去领奖」和「5 个人选 3 个排成一队」一样吗?不一样!领奖不分先后,排队要分先后。排列数顺序、组合不算顺序,这就是这一页最重要的分水岭。

考纲知识点:排列
组合
📖
考纲 · 知识点详述
摘自《CCF编程能力等级认证 C++&Python 认证标准》C++ 八级
  1. (2)掌握排列与组合基础知识。包括排列、组合的基本概念,及能实现基础排列和组合编程问题的一般方法。
📚
先学一学
花 6 分钟读完下面 5 课,再去闯关就不慌啦
1
🎖️ 排列:谁当第一很重要

排列是把一些东西排成一队(或一组有先后位置),「小蓝第一、小红第二」和「小红第一、小蓝第二」算两种。从 n 个不同元素里取 m 个排成一排,种数记作 A(n,m) 或 P(n,m):第一个位置有 n 种、第二个有 n−1 种…一直乘 m 个

🚩 例子:5 人选 3 人排队升国旗
第 1 位有 5 种、第 2 位剩 4 种、第 3 位剩 3 种:5 × 4 × 3 = 60 种。这就是「排列」——换一下位置就是新的一种。
💡 口诀:排列 = 排队选位置,顺序变、结果变;从 n 往下乘 m 个。
2
🍬 组合:选出来就行,不看先后

组合只是选出一组,不排位置顺序。从 n 个不同元素里选 m 个,记作 C(n,m)。因为每个组合里的 m 个元素任意交换(有 m! 种排法)都算同一种,所以:C(n,m) = A(n,m) ÷ m!

🍎 例子:5 本书选 2 本带走
先按排列算 5×4 = 20,但「先拿 A 再拿 B」和「先拿 B 再拿 A」是同一份 → 再除以 2! = 2,得到 C(5,2) = 10 种。
💡 口诀:组合 = 抓一把就走,顺序变、结果不变;先排列再除以 m!。
🧦 有相同东西怎么办(可重排列)
如果一堆球里有相同的颜色,比如 2 红 3 绿 5 黄共 10 个,全部排成一排:先当 10 个都不相同是 10!,但同色球之间换位置看不出来,要除以每种相同球的排列数:10! ÷ (2! × 3! × 5!) = 2520。
💡 口诀:同色球排列要「去重」:总数阶乘 ÷ 每种同色球阶乘的积。
3
⚖️ 一眼分清:看「名次/角色」有没有区别
🔍 判断小技巧
问题里有队长、班长、第 1 名、排头、顺序这种「位置不同结果不同」→ 排列;问题里只是选出几个人、几个球、几个委员(角色一样)组合
🧪 对比表
排列 A(5,3)=60:5 人里选 3 人分别当 第一/第二/第三(角色不同)
组合 C(5,3)=10:5 人里选 3 人一起去打扫(角色相同)
C(5,3) = A(5,3) ÷ 3! = 60 ÷ 6 = 10
💡 口诀:有「第几」是排列,没「第几」是组合;排列比组合多乘了顺序。
4
🚧 限制条件:捆绑法 / 插空法 / 先处理特殊位
🪢 必须相邻 → 捆绑法
甲乙两人必须站一起:先把甲乙捆成一个「大块」,和其它人一起排队,最后再乘甲乙内部顺序 2!。比如 5 人里 AB 必须相邻:4! × 2! = 48。
💡 口诀:相邻先捆绑,排完再解绑(乘内部顺序)。
🕳️ 不能相邻 → 插空法
先排「没要求」的人,在他们之间的空档里放「不能相邻」的人。比如 5 个红球排好有 6 个空档(含两头),把蓝球放进空档就不相邻。
💡 口诀:不相邻就插空;先排别人,再往空档里放。
🎯 特殊位置限制 → 先处理特殊位
「A 不能站队首」「首位不能是 0」「末位必须是偶数」——都先处理那个被限制的位置,再从剩下的里排其它位置,或者反过来用「总数 − 不满足的数」。
💡 口诀:谁被限制先排谁;要么正面分类,要么总数减掉坏情况。
5
🤖 程序里的排列:换位置试试看
💻 读代码:把排列都打印出来
看得懂就好,不用背。程序常用「交换 + 递归」把每种排队顺序都试一遍:
void pailie(int begin, int end, int a[]) {
  if (begin == end) { // 排完了,打印这一种
    for (int i = 0; i < end; i++) cout << a[i];
    cout << endl;
  }
  for (int i = begin; i < end; i++) {
    swap(a[begin], a[i]); // 把第 i 个换到 begin 位
    pailie(begin + 1, end, a); // 排剩下的
    swap(a[i], a[begin]); // 换回来(回溯)
  }
}
n 个不同元素全排列有 n! 种。这个函数用「先换、递归、换回」三板斧,把 n! 种顺序都试过——这种试遍所有可能再回来的方法叫回溯
💡 口诀:交换→递归→换回,三步走遍所有排列。
🌟 行业实际
外卖平台算「优惠券怎么组合最省钱」、体育比赛编排赛程、导航排「经过这几个地点的最优顺序」,背后都是排列组合计数 + 程序枚举。先会数,才知道方案多不多、枚举来不来得及。
🎯
闯关小锦囊 · 考点提醒
🎮
学完了?来闯关!
下面 16 个小挑战,点一点就能玩

Demo 原型 · 每个知识点独立页面 · 暂不含真实编译与进度存储。