女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

两顶帽子、三条围巾,女孩想知道一共几套搭配。机器人决定一套不漏地列出来。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 帽子 A配围巾 1、2、3
  2. 帽子 B配围巾 1、2、3
  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。