CC++ & Algorithm

加法原理与乘法原理

中等0
语言版本:C++
概述:加法原理是“要么…要么…”,乘法原理是“先…再…”,数数时用来计算不同选择的总数。

加法原理与乘法原理:数一数有多少种可能

你有没有遇到过这样的问题:今天穿什么衣服?有多少种搭配?或者从家到学校有几条不同的路可以走?这些“数一数有多少种可能”的问题,都可以用加法原理和乘法原理来解决。

  • 加法原理说的是:如果做一件事有两类不同的方法,而且这两类方法互不重叠,那么总方法数就是两类方法数相加。可以简单记成“要么…要么…”。
  • 乘法原理说的是:如果做一件事需要分成两步,第一步有几种方法,第二步有几种方法(两步互相独立),那么总方法数就是两步方法数相乘。可以简单记成“先…再…”。

学好这两个原理,你就能轻松算出很多计数问题。


1. 加法原理——“要么选这个,要么选那个”

解释:完成一件事,可以有不同的类别。比如从家到学校,你可以选择步行(有3条不同的路),也可以选择骑车(有2条不同的路)。步行和骑车是两类不同的方法,不会同时选(你不可能又走路又骑车),所以总共有 3 + 2 = 5 种走法。

更多生活中的例子

  • 买早餐:包子有4种馅,豆浆有3种口味。你只能选一种,要么买包子,要么买豆浆,总共有 4 + 3 = 7 种选择。
  • 选课外读物:故事书有6本,漫画书有5本。你只想借一本,可以借故事书或漫画书,总共有 6 + 5 = 11 种选择。

Python 验证

# 加法原理例子
walk_routes = 3  # 步行路线数量
bike_routes = 2  # 骑车路线数量
total_routes = walk_routes + bike_routes
print("从家到学校总共有", total_routes, "种走法")

输出:

从家到学校总共有 5 种走法

2. 乘法原理——“先做第一步,再做第二步”

解释:完成一件事需要分两步,两步彼此独立。比如搭配上衣和裤子:你有3件上衣(红、蓝、绿)和2条裤子(黑、白)。先选上衣(3种),再选裤子(2种),每一步的选择互相不影响,所以一共有 3 × 2 = 6 种搭配。

更多生活中的例子

  • 从家到学校,再放学去图书馆:从家到学校有3条路,从学校到图书馆有2条路。你“先”从家到学校,“再”从学校到图书馆,总共有 3 × 2 = 6 条不同的完整路线。
  • 选午餐套餐:主食有4种(米饭、面条、饺子、馒头),饮品有3种(果汁、牛奶、豆浆)。先选主食,再选饮品,一共有 4 × 3 = 12 种不同的午餐组合。

Python 验证

# 乘法原理例子
shirts = 3  # 上衣件数
pants = 2   # 裤子条数
outfits = shirts * pants
print("一共有", outfits, "种不同的搭配")

输出:

一共有 6 种不同的搭配

3. 两个原理结合使用——复杂问题拆解

很多计数问题不能只用加法或只用乘法,而需要两者配合。比如:

数字密码锁:一个4位密码锁,每一位可以从0~9中选一个数字。因为“先定第一位→再定第二位→再定第三位→再定第四位”,是连续的四步,每一步有10种可能,所以总共有
10 × 10 × 10 × 10 = 10000 种组合(乘法原理)。

如果密码第一位不能是0(比如手机锁屏不允许0开头),那么第一位只有1~9共9种,后三位仍然各有10种,总数就是
9 × 10 × 10 × 10 = 9000 种。

再比如:你想买一本课外书,可以选故事类(7本)或者科普类(5本);如果你选故事类,还可以再搭配一支笔(有4种)。这时候就要分情况讨论:

  • 如果只买书(不买笔):故事类7本,科普类5本,共7+5=12种(加法原理)。
  • 如果买书和笔:必须买一本故事书和一支笔,那么先选书(7种),再选笔(4种),共7×4=28种(乘法原理)。注意这里不能买科普书再配笔,因为问题规定了“选故事类再搭配笔”。更常见的问题是:可以选任意一本书(包括科普)再任意配一支笔,那就要用乘法:书的总数(7+5=12) × 笔的种数(4)= 48种。你看,先加法再乘法,或者先乘法再加法,要仔细读题。

Python 验证

# 密码锁例子
first_digit = 9   # 第一位不能是0,有9种
other_digit = 10  # 其他每位有10种
total = first_digit * other_digit * other_digit * other_digit
print("符合条件的密码共有", total, "种")

# 买书和笔的例子(任意一本书配任意一支笔)
story_books = 7
science_books = 5
pens = 4
total_books = story_books + science_books  # 先加法求书的总数
total_combos = total_books * pens          # 再乘法
print("买任意一本书和一支笔,共有", total_combos, "种组合")

输出:

符合条件的密码共有 9000 种
买任意一本书和一支笔,共有 48 种组合

4. 新手容易犯的错误

错误1:搞不清什么时候用加法,什么时候用乘法

  • 记好口诀:“要么…要么…”用加法(互斥的两类),“先…再…”用乘法(分步骤)。
  • 比如:从家到学校有3条路,从学校到图书馆有2条路,问从家到图书馆有几条路?这里是从家出发到学校,到图书馆,是连续的步骤,用乘法。很多同学却用了加法(3+2=5),但实际只有3×2=6条。因为每一条家→学校的路都可以搭配每一条学校→图书馆的路。

错误2:忽略了互斥或独立的条件

  • 加法原理要求各类方法互斥,即不能同时属于两类。例如:“周末活动可以看电影(3部)或去游乐园(4个项目)”,这里电影和游乐园是不同类,互斥,可以用加法。但如果电影票和游乐园门票可以同时选择?那就变成“要么看电影,要么去游乐园,或者两个都做”,这时不能直接用加法,要看具体问题。
  • 乘法原理要求各步骤独立,即第一步的选择不影响第二步的种数。如果第一步选了某样东西后,第二步的选择会变少,就不能直接用乘法。例如:从5个人中选1个当班长,再从剩下的4个人中选1个当副班长,第一步有5种,第二步有4种(因为一个人不能同时当两个职位),这时用乘法5×4=20,这是正确的,因为第二步的种数依赖于第一步的结果,但仍然是分步骤,乘法依然可用(条件概率下的乘法)。更准确地说,乘法原理的应用条件是:完成一件事需要依次连续做几步,且每一步的种数不受前面步骤具体选择的影响(或者可以计算出每一步的种数)。通常初学者只要记住“分步计数用乘法”即可。

错误3:把“或”和“且”混淆

  • 题目中“选一个水果,要么苹果要么香蕉”是加法;“先选一个水果,再选一个饮料”是乘法。要仔细读题,是“或”还是“和”。

5. 完整示例:周末计划

小明周末想安排活动:上午可以去图书馆(有3个不同的阅览室)或者去体育馆(有2个不同的场地)。下午可以去电影院(有4部电影)或者去公园(有5个景点)。问小明有多少种不同的周末安排方案?

分析

  • 上午:要么去图书馆,要么去体育馆,互斥,所以上午的方案数 = 3 + 2 = 5。
  • 下午:要么去电影院,要么去公园,互斥,所以下午的方案数 = 4 + 5 = 9。
  • 一天要安排上午和下午两个活动,先定上午,再定下午,是分步,所以总共 = 5 × 9 = 45 种。

Python 验证

# 完整示例:周末计划
morning_lib = 3      # 图书馆阅览室数量
morning_gym = 2      # 体育馆场地数量
afternoon_cinema = 4 # 电影院电影数量
afternoon_park = 5   # 公园景点数量

# 上午方案数
morning_ways = morning_lib + morning_gym
# 下午方案数
afternoon_ways = afternoon_cinema + afternoon_park
# 一天的总方案数(乘法)
total_ways = morning_ways * afternoon_ways

print("上午有", morning_ways, "种选择")
print("下午有", afternoon_ways, "种选择")
print("整个周末共有", total_ways, "种不同的安排")

输出:

上午有 5 种选择
下午有 9 种选择
整个周末共有 45 种不同的安排

6. 相关指引

掌握了加法原理和乘法原理,你就打开了计数世界的大门。接下来你可以学习:

  • 排列:从 n 个不同元素中取出 m 个按顺序排列,有多少种方法?比如从 5 本不同的书中选 3 本按顺序放在书架上。
  • 组合:从 n 个不同元素中取出 m 个(不考虑顺序),有多少种选法?比如从 5 本不同的书中选 3 本带回家。
  • 概率:用计数原理计算事件发生的可能性。比如掷骰子,计算点数为偶数的概率。
  • 鸽巢原理:一种有趣的计数推理,用来证明“一定存在某种情况”。

加法原理和乘法原理是排列组合的基础,也是信息学竞赛中“计数”类题目的常用工具。多练习生活中的例子,你就能越来越熟练。

例题精讲

1单选题

小明想从书架上的3本故事书和4本科技书中任选一本阅读,他有多少种不同的选择?

A7种
B12种
C3种
D4种
2判断题

完成一个任务需要依次经过两个步骤,第一步有5种方法,第二步有6种方法,则完成该任务共有11种方法。

3填空题
给定一个函数,计算从n种主食和m种饮料中各选一种的组合数。请补全代码。
def choose_meal(n, m):
    return ___
4单选题

从甲地到乙地,可以乘火车或坐飞机。每天有3趟火车和2班飞机。此外,还可以先乘船到丙地,再换乘汽车到乙地,其中船有2班,汽车有4班。请问从甲地到乙地共有多少种不同的走法?

A11种
B13种
C9种
D24种
5判断题

加法原理用于解决“分步”问题,乘法原理用于解决“分类”问题。