搬砖问题枚举搜索可视化

少枚举一个变量,会发生什么?从三重循环到二重循环的算法优化
D04-04 · 枚举搜索与优化
“如果 children 已经可以由 men 和 women 算出来,还需要第三重循环吗?”
总人数 / 砖数 n: 快捷:
人数: men + women + children = n
砖数: 6×men + 4×women + children = 2n

方案A · 三重循环全部枚举 (穷举所有组合)

0 / 29,791
for (men = 0; men <= n; men++) {
  for (women = 0; women <= n; women++) {
    for (children = 0; children <= n; children++) {
      if (men + women + children == n &&
          6*men + 4*women + children == 2*n) { ... }
    } } }
men (男: 3块) 0 外层循环
women (女: 2块) 0 中层循环
children (小: 半块) 0 内层穷举
人数式: 0+0+0 = 0 (目标: 30) 不符
搬砖式: 6(0)+4(0)+0 = 0 (目标: 60) 不符
序号 men women children 人数和 砖式和 判定
等待开始 · 预计 (n+1)³ 次尝试

方案B · 二重循环 + 计算 children (代数化简剪枝)

0 / 176
for (men = 0; men <= n / 3; men++) {  // 缩小范围
  for (women = 0; women <= n / 2; women++) {
    children = n - men - women;  // 直接代数计算
    if (children >= 0 &&
        6*men + 4*women + children == 2*n) { ... }
  } }
men (0 ~ n/3) 0 外层枚举
women (0 ~ n/2) 0 内层枚举
children (计算值得出) 30 无需第三重循环
代数算式: children = 30 - 0 - 0 = 30 (天然保和) ≥0有效
搬砖式: 6(0)+4(0)+30 = 30 (目标: 60) 不符
序号 men women children 搬砖和 目标 2n 判定
等待开始 · 预计 (n/3+1)×(n/2+1) 次尝试
教学箴言:优化不是“少算几个答案”,而是“用更少的尝试找到同样的答案”;能算出来的变量,绝不继续枚举!