有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它辅助容器。
这是一道经典题目,一般人都可以在一分钟内给出答案,不过,很多人可能没有注意到这道题的答案不是唯一的。先来看看最常见的一个答案,也是目前已知最快的操作步骤,共需要7次倒水动作:
bucket_states : 3 5 0 from 0 to 1 dump 5L water.
bucket_states : 3 2 3 from 1 to 2 dump 3L water.
bucket_states : 6 2 0 from 2 to 0 dump 3L water.
bucket_states : 6 0 2 from 1 to 2 dump 2L water.
bucket_states : 1 5 2 from 0 to 1 dump 5L water.
bucket_states : 1 4 3 from 1 to 2 dump 1L water.
bucket_states : 4 4 0 from 2 to 0 dump 3L water.
另一种方案:
bucket_states : 5 0 3 from 0 to 2 dump 3L water.
bucket_states : 5 3 0 from 2 to 1 dump 3L water.
bucket_states : 3 5 0 from 0 to 1 dump 2L water.
bucket_states : 3 2 3 from 1 to 2 dump 3L water.
bucket_states : 6 2 0 from 2 to 0 dump 3L water.
bucket_states : 6 0 2 from 1 to 2 dump 2L water.
bucket_states : 1 5 2 from 0 to 1 dump 5L water.
bucket_states : 1 4 3 from 1 to 2 dump 1L water.
bucket_states : 4 4 0 from 2 to 0 dump 3L water.
在这个问题中这中倒水方案是操作动作最少的方式。那么到底有多少种倒水方式可以得到结果?最少的倒水次数又如何?
解决问题的思路
如果用人的思维方式,那么解决这个问题的关键是怎么通过倒水凑出确定的1升水或能容纳1升水的空间,考察三只水桶的容积分别是3、5和8,用这三个数做加减运算,可以得到很多组答案,例如:
3 – (5 - 3) = 1
这个策略对应了上面提到的第一种解决方法,而另一组运算: