http://blog.chinaunix.net/u/30202/showart_391485.html
http://bjydfq.itpub.net/post/7617/42768
题目:两瓶 8 两的酒,一个 3 两的杯子,瓶和杯子都没有刻度,如何将酒平均分给四个人喝?也就是每个人分 4 两酒,也没什么限制条件,当然,喝过的酒不能再吐出来(: > )。
思路:回溯算法,递归
对当前酒瓶,杯和人当前存的酒量设定为一种状态,最初始的状态为( 880 , 0000 ),最终的状态为( 000 , 4444 ),状态的改变为分酒的选择,一共有 18 种选择:
A 类:瓶子到杯子, 2 种
B 类:杯子到瓶子, 2 种
C 类:杯子到人, 4 种
D 类:瓶子到人, 8 种
E 类:瓶子到瓶子, 2 种(我没有考虑)。
F 类:人到杯子,人到瓶子,人到人不被允许。
不能用简单穷举,因为,如果穷举,要达到可行解,需要 18^24 次方这么多尝试,计算机没能力计算这么多步的。
回溯方法是深度搜索,选定一个方法一路向下走,直到没得路可走了,也就是所有的选择都到达了非法的状态,那么回到上一个状态,选择下一个选择,这样一路到达可行解。虽然不是最优的,一定是最快的。
实现代码如下: