倒水问题(《怎样解题》中的经典问题)

[问题]有两个容桶,小桶的容量是4升,大桶的容量是9升,怎样才能从河中恰好打上6升水呢?
[解析]
       方法1:规约法(以下内容引自《How To Solve It》)
             让我们弄消楚所给定的工具,我们必须用这两个容器来工作(已知的是什么?)。
             目前我们还不知道怎样去量出恰好6升,但我们是否能测量其他某个东西?(如果你不能解决所提问题,首先去解决某个与此有关的问题。你能从已知数据导出来些有用的东西吗?)
             让我们做点事,我们能够把大桶装满,然后倒掉小桶那么多;这样,我们就能够得到5升水。我们能不能也得到6升水呢?
             当碰到这个难题时,我们就像绝大多数人所做的那样。我们从两个空桶开始,试试这个,试试那个,我们倒空又装满,而当我们不成功时,我们重新开始,试试别的做法。我们在向前干,即,从给定的初始情况到所期望的最终情况,从已知数据到未知数。经过多次试验,我们偶尔也会成功(正向试错)。
             但是有卓越才能的人,或者从数学课中所学到的不仅仅是套公式演算的人,不会在这种试验里浪费太多的时间,而是回过头去开始“倒着干”。
             要求我们干的是什么?(未知数是什么?)让我们尽可能清楚地想象一下我们所要达到的最后解答是怎样的。让我们设想,在我们面前,大桶中正好有6升水,而小桶空空如也(让我们“从所要求的开始,并设所要求的已求得”)。
             从前面什么情况我们能够得到期望的最终情况呢(让我们“研究从什么前项可导出所求结果”)?当然,我们能够灌满大桶,即灌到9升。
            但是,接着我们应该能够正好倒掉3升。而为了做到这点,我们必须在小桶中正好有1升水!这就是念头。我们刚才所完成的一步全然并非易事。很少人能够毫不犹豫地想到它。事实上,认识到这一步的意义,我们就可预见到下面求解的一个梗概。
           可是我们怎么达到刚才的情况呢?让我们“再进一步研究,那个前项的前项是什么?”我们想,于是小桶有1升水可以转化为大桶有1升水,而后大桶倒到小桶里。怎么能让大桶剩1升水呢?我们已经遇见过类似的情况,即我们把大桶装满水,然后倒出4升给小桶,再由小桶倒入河中,这样接连干两次。我们“最后终于碰到某个已知的东西”并且随着“倒着干”的分析方法,找到了适当的操作序列。
方法2:穷举法
           其基本思想是:将小桶灌满后,将其中的水全部倒入大桶,如果在倒入大桶的过程中大桶满了,则将大桶倒空,继续将小桶中的水全部倒入大桶。持续这一操作直到大桶中水的体积等于目标体积为止。(也可以从大桶向小桶中倒水,原理是一样的)
          其数学计算过程为用小桶容量的倍数对大桶的容量进行取余:
          4 % 9 = 4
          8 % 9 = 8
          12 % 9 = 3
          16 % 9 = 7
          20 % 9 = 2
          24 % 9 = 6
          成功得到6升水。
          要注意像用2升的桶和4升的桶得到3升水这种不可解的情况,这种不可解情况在用上面的方法进行计算时会得到循环数列。其根本原因是两个桶容量的大于1的最大公约数无法被目标体积所整除,如6升的桶和9升的桶无法得到2升水,因为6和9的最大公约数3无法被2整除。

原文地址:https://www.cnblogs.com/laifeiyao/p/3382061.html