水杯装水问题

可能很多人都听说过水杯装水的问题,因为这是一个很经典的数学问题,很能考察一个人的思维能力和逻辑能力,广泛出现在各行各业的面试题和一些智力竞赛中。那水杯装水问题具体描述是什么样呢?最常见的情况,就是给你两个水杯,两个杯子的容量都是固定的(比方说一个杯子的容量为3L,一个为5L),但是没有刻度,然后给你足够量的水,问你能否凑出某个体积的水(比方说凑出4L)。这是出现的比较多的,也是比较简单的情况,我们可以通过一定的简单模拟和推导来解决这个问题。
由于没有刻度,我们不能利用已知两个杯子的容量来取的特定的容量的水,但是可以取到两种容量,即装满和空。比方说对于5L的水杯,我们是无法恰好倒入2L、3L、4L这么多水,但是可以倒满,此时为5L,也可以不倒水,即空杯0L。类似的3L的水杯亦是如此。所以为了凑出4L水,我们只能依靠这两个杯子的一些“特定状态”得到。
下面我们来尝试解决这个问题,由于没有什么好的思路,我们不妨可以尝试一些启发式的搜索。不难想象,我们可以先把3L的水杯倒满,然后把3L水杯中的水杯给全部倒入到空的5L的杯子,此时5L的杯子还剩2L的容量,接着,我们继续把3L水杯给到满,然后同样全部倒入5L的杯子中直至倒满,显然,5L杯子之前已经有3L水了,第二次倒的时候,把5L水杯给倒满只可能倒入2L水,这样3L的杯子里还有1L的水,这样我们就得到了一个上面所说的“特殊状态”,即3L水杯里得到了1L的水的“刻度”。然后我们继续把5L水杯里的水给倒完,把3L水杯里的1L水给倒入到5L的空杯子。接下来的操作就很明朗了,5L杯子已经有了1L水,只需要把3L水杯装满然后全部倒入5L的水杯,这样5L的水杯里就有4L的水了。问题解决。
我们在解决上面的简单情况的时候,仅靠的是一种没有规律的搜索或者说是启发式的尝试得到的,对于数值不大的情况我们可以通过人脑来进行推理,但是如果数值比较庞大,比方说几十万,几百万的两个水杯,让凑出特定的体积的水,就不是那么容易去解决了。解决这种问题的思路是从简单的例子中抽象出数学模型,经过一定的推导得出算法然后交给计算机去解决,所以这个问题最关键的点就在于如何抽象成一般的数学问题。
难以解决这个问题的难点在于我们倾向于把自己的思维局限在如何去调整这两个水杯。但实际上,我们可以跳出这个圈子。假设有一个足够 大的空水池来表示两个水杯的水体积之和,(具体有多大呢?应该是两个水杯的容积之和,因为我们肯定无法用容积为x和y的两个杯子凑出比x+y更多的水)这个空水池的水的体积就是两个水杯中的水的容量,然后我们用两个容量固定的水杯往水池里装水倒水。以刚才的例子为例,开始倒满3L水杯,我们可以理解成往空池子倒入了3L水,然后倒入5L的水杯可以认为什么都没有发生,因为没有水从两个水杯中的某个出去,也没有水从外面进入这两个水杯,接着我们把3L水杯倒满,相当于往尺子又加了3L水,此时水池有6L水。然后将3L水杯里的水倒入到5L水杯的时候,对于水池同理是没有任何变化,所以仍是6L水。接着我们把5L水杯里的水给倒完,这就相当于把水池里的5L水给排出去了,所以水池还剩1L水,接着我们倒满3L水杯相当于往水池加了3L水,此时水池就有了4L水,最后一步只是把水从3L水杯转移到5L水杯,所以水池水不发生变化,仍是4L,即是需要求的水的体积。
经过上面的分析,不难发现这个之前看起来较为复杂的问题就转变成了一个比较明显的问题。即我们现在有x和y两个值,分别代表两个水杯的固定容量,然后有个水池,水池容量为z,通过若干的倒入倒出(记为m或者n)能否凑出z。对应的数学问题即是是否存在m和n,使得z = n * x + m * y成立(m、n如果大于0即倒入,小于0即倒出)。比如上面的例子实际上就是这样的表示:
4 = (-2) * 3 + 2 * 5
现在我们已经把复杂的问题转化成了一个数学问题,我们就需要去考虑使用一些数学工具来解决这个问题。引入一个定理,叫做裴蜀定理(也译作贝祖定理)。这是在数论中的一个关于最大公约数的定理,得名于法国数学家艾蒂安·裴蜀。它的具体内容是:
对任何正数a、b和m,关于未知数x和y的线性丢番图方程(称为裴蜀等式)ax+by = m有整数解时,当且仅当m是a和b的最大公约数d的倍数。
举个例子,12和42的最大公约数是6,则12x + 42y = 6是有解的。这个定理的证明需要专业的数学知识基础,所以这里就不做证明,而是直接来使用这个结论。
我们把刚才的问题对应到上面的丢番图方程,即a和b是水杯的容量,m是需要求的水的体积,现在我们需要知道x和y存不存在,只需要判断m是否是a和b的最大公约数的倍数即可。如果是那就一定能凑出这么多水,如果不是那就凑不出来&#

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值