🎲

计数原理:加法与乘法

「几种走法?几套搭配?」——数「有多少种」有两把金钥匙:二选一把数相加,一步一步把数相乘。

💡 打个比方

想象你要从学校(A)到同学家(B)。可以坐火车(3 种车次),也可以坐大巴(2 种线路)。只要挑其中一类就能完成「A→B」,所以总走法 = 3 + 2 = 5 种——这叫加法原理,关键是「二选一,任何一类单独就能办成事」。

再想一件出门的事:先挑上衣(3 件),再挑裤子(4 条),两步都做完才算穿好。两步缺一不可,所以总搭配 = 3 × 4 = 12 套——这叫乘法原理,关键是「一步一步,每一步都要做」。

一句话口诀:「分类能单独办成 → 加;分步才办得成 → 乘」。

术语:加法原理(Addition Principle:做一件事按「类」分,每类都能单独完成,总方法数 = 各类方法数相加);乘法原理(Multiplication Principle:做一件事按「步」分,每步必须完成,总方法数 = 各步方法数相乘);分类不重不漏(各类不互相包含、又覆盖所有情况);枚举(把每一种可能一一列出来数数)。

🖼️ 大图看明白

左边:两个生活场景——加还是乘? 火车 ×3 大巴 ×2(虚线) A B 二选一 → 3 + 2 = 5 种 场景 2:1 上衣 + 1 裤子 = 1 套 A B C 1 2 3 4 上衣 3 件 裤子 4 条 一步一步 → 3 × 4 = 12 套 右边:两条金规则 & 怎么区分 加法原理 —— 二选一(分类做) 总方法数 = n1 + n2 + … + nk 例:A→B:火车 3 种 + 大巴 2 种 = 5 种 乘法原理 —— 一步一步(分步做) 总方法数 = n1 × n2 × … × nk 例:穿衣:上衣 3 件 × 裤子 4 条 = 12 套 怎么区分?问自己一句话: 「单独一类能办成整件事吗?」 能 → 相加(二选一) 不能、要好几步 → 相乘(一步一步)

🧩 子任务 1:加法原理——「分类做」,把数加起来

🎯 小目标:理解「单独一类就能办成整件事 → 相加」,会手推,并知道什么叫「分类不重不漏」。

从 A 到 B:火车 3 种车次、大巴 2 种线路。注意——只坐火车就能到,只坐大巴也能到:每一类单独拿出来都能完成「A→B」这件事,这叫「二选一」。所以把各类的走法加起来。

// 手推:加法原理(二选一 → 相加)
A → B:火车 3 种 + 大巴 2 种 = 5 种

// 类别更多也一样:火车 3、大巴 2、直飞航班 4
3 + 2 + 4 = 9 种

// 「分类不重不漏」两条铁律:
// ① 不重:同一种走法只能算进一个类别(不能重复计数)
// ② 不漏:每种走法都必须被某个类别覆盖(不能漏数)

// 反例(重了):把「坐火车 3 种」和「坐陆路车辆 5 种」当两个类别相加,
// 火车的 3 种被数了两次 → 3 + 5 = 8 是错的,正确还是 5 种。
✅ 小检查:① 大巴又新开 2 条线路,A→B 一共多少种走法?② 用一句话说说「分类重了」是什么意思。③ A→B 火车 3 种,B→C 大巴 2 种(必须先到 B 再换乘),A 到 C 一共多少种?(提示:这题还能用加法吗?)
看看答案 ① 3 + (2+2) = 7 种(大巴类别里现在是 4 种)。② 同一种走法被两个类别都数了一遍,比如把「火车 3 种」和「陆路 5 种」并列相加,火车就被数了两次。③ A→C 要先 A→B 再 B→C,一步都不完整、必须两步都做完 → 用乘法:3 × 2 = 6 种。这就是乘法原理,下一小节细讲!
易错:「A→B 3 种、B→C 2 种,所以 A→C = 3+2 = 5 种」——本课最常见的错!中间要换乘,说明每一步都办不成整件事,是「一步一步」→ 相乘得 6 种。判断口诀:单独一步能不能办成整件事?

🧩 子任务 2:乘法原理——「分步做」,把数乘起来

🎯 小目标:理解「每一步都必须做 → 相乘」,会用列表一一枚举搭配,养成「固定一步、枚举另一步」的习惯。

3 件上衣(A、B、C)、4 条裤子(1、2、3、4)。穿好需要两步:先选上衣、再选裤子——只穿上衣不算穿好,只穿裤子也不算。每一步都办不成整件事,所以把各步的选择数乘起来。动手枚举一遍,数一数:

// 手推:枚举所有搭配(固定上衣,逐条配裤子)
  A-1   A-2   A-3   A-4   // 上衣 A 能配 4 种
  B-1   B-2   B-3   B-4   // 上衣 B 能配 4 种
  C-1   C-2   C-3   C-4   // 上衣 C 能配 4 种

// 数一数:4 + 4 + 4 = 12 套
// 换个角度:每一件上衣都能配 4 条裤子,3 件上衣 → 3 × 4 = 12 套

// 三步也行:凉菜 3 种、热菜 4 种、饮料 2 种,各选 1 份 = 1 份套餐
3 × 4 × 2 = 24 份(先选凉菜,再选热菜,再选饮料,三步相乘)
✅ 小检查:① 裤子再添 1 条(共 5 条),搭配总数变多少?比原来多几套?② 用 1~9 这 9 个数字组成不重复的两位数,能组成多少个?(提示:分两步——先定十位、再定个位)③ 凉菜 3 种、热菜 4 种,「凉菜 + 热菜」的组合(不选饮料)有多少种?
看看答案 ① 3 × 5 = 15 套,比原来多 15 − 12 = 3 套(每件上衣各多配 1 条新裤子,3 件 = 3 套)。② 十位 9 种选法;个位不能用十位已选的数字 → 8 种 → 9 × 8 = 72 个。③ 两步:3 × 4 = 12 种。
易错:「3 件上衣、4 条裤子,一共 3+4 = 7 套」——加法是「二选一」用的,而穿衣要上衣裤子都要有(两步),得相乘。另外乘法没有顺序(3×4 = 4×3),但枚举时「固定上衣、枚举裤子」最不容易漏。

🧩 子任务 3:区分两者——「二选一」还是「一步一步」?

🎯 小目标:背熟判断口诀「单独一类能办成整件事吗?」,会解混合题(先加后乘)。
// 判断流程(背下来):
//   要做「一件事」,问:单独一类能办成整件事吗?
//   ├─ 能(二选一)→ 加法原理,各类相加
//   └─ 不能,要一步步做(分步)→ 乘法原理,各步相乘

// 题 1(加):午餐只点 1 道菜,凉菜 3 种或热菜 4 种 → 3 + 4 = 7 种
//   分析:只点一道,点凉菜或点热菜都办成「点菜」→ 二选一 → 加

// 题 2(乘):套餐 = 1 凉菜 + 1 热菜 → 3 × 4 = 12 种
//   分析:两道都要有,缺一道就不算套餐 → 分步 → 乘

// 题 3(混合:先加后乘):点 1 道菜(凉菜或热菜)+ 1 杯饮料(2 种)
//   第一步「选菜」内部是二选一:3 + 4 = 7 种
//   「选菜」和「选饮料」是两步:7 × 2 = 14 种

// 题 4(进阶):甲乙丙丁 4 人,选 3 人分别当班长、副班长、宣传委员,多少种?
//   第一步当班长:4 人选 1 → 4 种
//   第二步当副班长:剩下 3 人选 1 → 3 种(班长不能再当)
//   第三步当宣传委员:剩下 2 人选 1 → 2 种
//   → 4 × 3 × 2 = 24 种(每步的选择数取决于前面的结果)
✅ 小检查:① 把题 3(14 种)的每一步分别归为「分类」或「分步」,并说明为什么。② 4 人中选 2 人去图书馆(不分职务),有多少种?(提示:先按乘法算,再想想「甲先乙后」和「乙先甲后」是不是同一组人?下一课的组合会细讲)③ 从 1~9 选 1 个数字,几种?选 2 个数字排成一个两位数(十位、个位不同),几种?
看看答案 ① 「选 1 道菜」是分类:凉菜、热菜两类都能单独办成「点 1 道菜」→ 3+4=7;「菜 + 饮料」是分步:只点菜不算完整订单,只点饮料也不算 → 两步相乘 7×2=14。② 按乘法:第 1 人选 4 种、第 2 人 3 种 = 12;但「甲先乙后」与「乙先甲后」是同一组 2 人,12 里每组被数了 2 遍 → 12 ÷ 2 = 6 种(下节课组合 C(4,2) = 6 会正式学)。③ 9 种;9 × 8 = 72 种。
易错:题 4 写成 4×4×4 = 64——副班长不能和班长是同一个人!「不重复」意味着后一步的可选人数少 1。凡是「一个人只能占一个位置」的题,每一步的选择数都要减掉已经用掉的。

🧩 子任务 4:编程——菜单搭配计算器

🎯 小目标:写程序输入三类菜的数量,输出套餐总数(乘)与单点总数(加),并枚举前 5 种套餐。

把两条原理写进代码:套餐 = 凉菜 + 热菜 + 饮料三步 → 相乘;单点 = 只点 1 道菜(凉菜或热菜)→ 相加。再用三重循环把套餐一一列出来(只列前 5 种,防止刷屏)。

// 输入:凉菜数 a、热菜数 b、饮料数 c
// 输出:套餐总数(乘法)、单点总数(加法)、前 5 种套餐
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    cout << "套餐总数: " << a * b * c << endl;   // 三步 → 相乘
    cout << "单点总数: " << a + b << endl;        // 只点 1 道菜 → 相加
    int cnt = 0;                                 // 已列出的套餐数
    for (int i = 1; i <= a && cnt < 5; i++)       // 凉菜 1..a
        for (int j = 1; j <= b && cnt < 5; j++)   // 热菜 1..b
            for (int k = 1; k <= c && cnt < 5; k++, cnt++)
                cout << "套餐" << cnt + 1 << ": 凉" << i
                     << " 热" << j << " 饮" << k << endl;
    return 0;
}
// 示例:输入 3 4 2 → 套餐总数: 24 / 单点总数: 7 / 列出套餐 1~5
// 输入 1 1 1 → 套餐总数: 1 / 单点总数: 2 / 套餐1: 凉1 热1 饮1
✅ 小检查:① 输入 2 3 4,程序会输出什么?② 条件里的 cnt < 5 是干什么用的?去掉后会发生什么?③ 想只枚举「凉菜 + 热菜」(不配饮料)的搭配,循环要改哪里?
看看答案 ① 套餐总数 2×3×4 = 24,单点总数 2+3 = 5,然后列出前 5 种套餐(凉1热1饮1、凉1热1饮2、凉1热1饮3、凉1热1饮4、凉1热2饮1)。② 只枚举前 5 种,防止 a×b×c 太大时刷屏;去掉后会把全部 a×b×c 种套餐都打印出来(比如 10 10 10 就打印 1000 行)。③ 删掉最内层饮料循环(k 那一层),循环体改成输出「凉 i 热 j」,总数就是 a×b 种。
易错:把套餐总数写成 a + b + c(那是「只点 1 份」的单点逻辑),或把单点总数写成 a * b(那是套餐逻辑)。写代码前先问一句:办成这件事要几步?一步就能办成就加,要多步就乘。

💻 完整代码:菜单搭配计算器(加法 + 乘法一起用)

// 输入:凉菜数 a、热菜数 b、饮料数 c
// 输出:① 套餐总数(三步 → 乘)② 单点总数(一道菜 → 加)
//       ③ 套餐数不多时全枚举 ④ 新增 1 种凉菜后多几份套餐
// 示例:输入 3 4 2 → 套餐 24 / 单点 7 / 列出 24 份 / 新增凉菜多 8 份
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;

    cout << "套餐总数: " << a * b * c << endl;   // 凉+热+饮 三步 → 乘
    cout << "单点总数: " << a + b << endl;        // 凉菜或热菜 → 加

    // 套餐数量不大时(≤30),把每份套餐都列出来
    if (a * b * c <= 30) {
        int cnt = 0;
        for (int i = 1; i <= a; i++)
            for (int j = 1; j <= b; j++)
                for (int k = 1; k <= c; k++) {
                    cnt++;
                    cout << "套餐" << cnt << ": 凉" << i
                         << " 热" << j << " 饮" << k << endl;
                }
    }
    // 新增 1 种凉菜:新总数 (a+1)*b*c,比原来多 b*c 份
    // (每种「热+饮」组合都多配一份新凉菜 → b*c 份)
    cout << "新增 1 种凉菜: 多 " << b * c << " 份套餐" << endl;
    return 0;
}
// 动手验证:输入 1 1 1 → 套餐 1 / 单点 2 / 套餐1: 凉1 热1 饮1 / 多 1 份

✋ 你来试试

第 1 题:A→B 有火车 4 种、大巴 3 种、飞机 2 种;B→C 有汽车 2 种(必须到 B 换乘)。A 到 C 一共多少种走法? A→B 三类都能单独到达 → 加法:4 + 3 + 2 = 9;B→C 是第二步 → 乘法:9 × 2 = 18 种。
第 2 题:一个三位密码:百位 1~9,十位和个位 0~9,一共能组成多少个密码? 三步:百位 9 种、十位 10 种、个位 10 种 → 9 × 10 × 10 = 900 个。
第 3 题:4 名候选人选 1 名班长、1 名副班长,两个职位不能由同一人担任,有多少种选法? 分两步:班长 4 种,副班长从剩下 3 人选 → 4 × 3 = 12 种(注意「甲当班长、乙当副班长」和反过来的 12 种都算,因为职位不同——这正是下一课「排列」的主角!)
第 4 题(加餐):5 个人站成一排合影,一共有多少种站法?(提示:分 5 步填 5 个位置,每步可选人数少 1) 第 1 个位置 5 种、第 2 个 4 种、第 3 个 3 种、第 4 个 2 种、第 5 个 1 种 → 5 × 4 × 3 × 2 × 1 = 120 种。数学上把 5×4×3×2×1 记作 5!(读「5 的阶乘」)——下一课「排列」就是专门数这种「排位置」的事。
🎯 一句话记住:分类能单独办成就「加」(二选一),要一步一步办成就「乘」(分步做);分类必须不重不漏;写程序前先问「办成这件事要几步」,再决定加还是乘。