转载

1.问题描述

小孩分油问题

两个小孩去打油,一人带了一个一斤的空瓶,另一个带了一个七两、一个三两的空瓶。原计划各打一斤油,可是由于所带的钱不够,只好两人合打了一斤油,在回家的路上,两人想平分这一斤油,可是又没有其它工具。试仅用三个瓶子(一斤、七两、三两)精确地分出两个半斤油来。

2.算法设计

令状态R、E、S分别表示十两、七两和三两的瓶子中所装的油量。如问题所述,初始时有(R,E,S)=(10,0,0),问题要求即仅通过这三个瓶子,将油量状态转变为(R,E,S)=(5,5,0)。
该问题较为特殊,我们发现七两的瓶子和三两的瓶子所能装的油的总量恰好为十两。因此,我们可以将十两的瓶子等同于一个无穷大的油桶,任何时候七两和三两的瓶子都可以通过这个油桶装满或倒空油。在这个假设下,原问题即被简化为:初始状态(E、S)=(0,0),要求仅通过这两个瓶子,将状态转变为(E、S)=(5,0)。在这个目标状态下,十两的瓶子中自然装了五两油。
将两个瓶子的状态转变以及对应的规则列表如下:

规则号
规则
解释
(E,S) and E