
一起动脑筋 · 先看一个小故事
两顶帽子、三条围巾,女孩想知道一共几套搭配。机器人决定一套不漏地列出来。
把过程摊开来看
- 帽子 A配围巾 1、2、3
- 帽子 B配围巾 1、2、3
- 清点一共 6 套
枚举把允许的候选情况逐个列出,再判断是否满足要求。
先确定范围,再确定顺序,就能避免重复和遗漏。这里每种帽子都要配完三条围巾。
01什么是枚举?
枚举(Enumeration)就是把规定范围内的候选情况一个一个检查。
例如找 1 到 100 中所有能被 7 整除的数:
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
std::cout << i << ' ';
}
}
02枚举是不是“瞎试”?
不是。好的枚举必须有明确的枚举对象、范围和检查规则。
枚举什么?
候选答案或状态。
枚举到哪里?
范围必须完整。
怎样检查?
用题目条件判断。
03为什么枚举很重要?
因为它通常最容易保证正确,也能帮助我们理解题目。
04怎样避免漏情况?
例如枚举 1 到 n:
for (int i = 1; i <= n; i++)
要先确认边界:1 和 n 是否都应该被检查。
05两重枚举是什么意思?
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
// 检查一对不同元素
}
}
这里枚举所有满足 i < j 的下标对,避免把同一对重复两次。
06枚举什么时候会太慢?
当候选数量非常大时,逐个尝试可能做太多工作。
例如 n 个元素的两重枚举大约会检查 n² 级别的组合;n 从 1000 变成 100000 时,工作量会增长很多。
你已经知道了什么
- 枚举是系统地逐个检查候选情况。
- 枚举不是乱猜,要明确范围和判断条件。
- 边界设计决定会不会漏情况。
- 多重枚举可以覆盖组合,但工作量可能快速增长。
- 枚举常是设计更快算法的起点。
下一篇:模拟:让程序照着规则走
轮到你来试一试
如果只能使用围巾 1 和 2,现在有几套搭配?
想好了吗?点开看解释
4 套。两顶帽子各配两条围巾,2 × 2 = 4。