有三个桶,容积分别是3升、5升、8升。容量为8升的桶装满了水。体积是3升,体积是5升的桶都空了。三斗内无鳞。现在要把大桶里的8升水分成两份,每份4升水。附加条件是只能使用这三个桶,不能使用其他辅助容器。“嗯,是的,这是一个很经典的问题。”“不过,我们也想不通,不信,请继续往下看。”答案是“废话不说,看方法”。第一步(7步)用8L桶装满5L桶的水。此时:8L桶为3L,5L桶为5L,3L桶为0L。将3L桶中的水装满5L桶。此时:8L桶为3L,5L桶为2L,3L桶为3L。将3L桶中的水倒入8L桶中。此时:8L桶为6L,5L桶为2L,3L桶为0L。将5L桶中的水8L桶中的水倒入3L桶中。此时:8L桶为6L,5L桶为0L,3L桶为2L。将8L桶中的水倒入5L桶中。此时:8L桶为1L,5L桶为5L,3L桶为2L,将5L桶中的水倒入3L桶中,此时:8L桶为1L,5L桶为4L,3L桶为3L,把3L桶里的水倒进8L桶里,此时:8L桶是4L,5L桶是4L,3L桶是0L第二步(8步)把3L桶装满8L桶里的水,此时时间:8L桶是5L,5L桶把3L桶里的水倒进5L桶里。此时:8L桶为5L,5L桶为3L,3L桶为0L。将8L桶中的水倒入3L桶Bucket中,此时:8L桶为2L,5L桶为3L,3L桶为3L将3L桶装满水,则:8L桶为2L,5L桶为5L,3L桶是1L把5L桶里的水倒进8L桶里。此时:8L桶为7L,5L桶为0L,3L桶为1L。将3L桶中的水倒入5L桶中。此时:8L桶为7L,5L桶为1L,3L桶为0L。将8L桶装满水以填充3L桶。此时:8L桶为4L,5L桶为1L,3L桶为3L。将3L桶装满水,倒入5L桶。此时:8L桶为4L,5L桶为4L,3L桶为0L。我相信答案一定不止两个。有多少个答案?带着这个问题,我们来设计一个算法。问题分析用人的思维解决这个问题的关键是如何通过倒水的方式来补足一定的1升水或者一个可以容纳1升水的空间。比如8L的水桶或者5L的水桶或者3L的水桶里有1L水的时候,可以很快的倒出4L的水。计算机思维“穷举法”中桶的初始状态:8L桶装满水,3L和5L桶是空的。水桶的最终状态:3L的水桶是空的,5L和8L的水桶各有4L的水。假设以每个状态下三个桶中的水量作为状态。从$status=array(8,0,0)你得到$status=array(4,4,0)。当然,会有一些限制:1.每个bucket都有一个最大值:0<=status[0]<=8;0<=状态[1]<=5;0<=状态[2]<=3;2.当前注水后各桶的状态不能与历史注水后各桶的状态相同。3.当当前桶为空时,不能倒入其他桶中。4.当当前桶达到最大容量时,其他桶不能再往这个桶里倒水。程序代码(PHP)运行结果中一共有16种浇注方法,方法如下:...(16种方法,太长贴不出来,请在本地试一下,需要源码的请关注公众号来留言吧。)总结运行代码后,一共找到了16种倒水的方法,最快的方法需要7步。“怎么样,没想到会有这么多方法吧?去测测你的朋友吧。”本文欢迎转载,转载请注明作者和出处,谢谢!推荐阅读系统详解-SSO单点登录系统详解-PHPWEB安全防御系统详解-PHP缓存技术系统详解-PHP接口签名验证系统详解-PHP浮点数高精度运算一起学习
