问题

假设有一个池塘,里面有无穷多的水。现有 2 个空水壶,容积分别为 5 升和 6 升。请问如何只用这 2 个水壶从池塘里取得 3 升水?

拖动水壶到池塘装水、到另一壶倒水、到右下角倒空,试着量出 3 升。

引申:如何取得 1 ~ 4 升水?

分析

两个水壶无法直接量出 3 升,需要通过倒水组合出目标量。关键操作:装满、倒空、在两个壶之间转移。

5 升和 6 升的最大公约数是 1,因此理论上可以量出 1 ~ 6 升之间的任意整数升水。

取得 3 升

步骤操作5L 壶6L 壶
1装满 5L50
25L 倒入 6L05
3装满 5L55
45L 倒入 6L 直至 6L 满(需 1L)46
5倒空 6L40
64L 倒入 6L04
7装满 5L54
85L 倒入 6L 直至 6L 满(需 2L)36

最终 5L 壶中剩余 3 升

引申:取得 1 ~ 4 升

1 升

步骤 1~4 之后 5L 壶有 4L,6L 壶满。倒空 6L,将 4L 倒入 6L,再装满 5L 倒入 6L(需 2L),5L 壶剩 1L

2 升

步骤操作5L 壶6L 壶
1装满 6L06
26L 倒入 5L51
3倒空 5L01
41L 倒入 5L10
5装满 6L16
66L 倒入 5L 直至 5L 满(需 4L)52

最终 6L 壶中剩余 2 升

4 升

步骤 1~4 直接得到 5L 壶中 4L

总结

这类倒水问题的通用思路:

  1. 确认两壶容量是否互质(gcd=1),互质则可量出任意整数升
  2. 用表格跟踪每步两个壶的剩余量,避免混乱
  3. 目标量 = 大壶倒满后向小壶转移的「剩余差值」