有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
装满任意一个水壶 清空任意一个水壶 从一个水壶向另外一个水壶倒水,直到装满或者倒空 (From the famous “Die
Hard” example)
示例 1:
输入: x = 3, y = 5, z = 4
输出:
True
示例 2:
输入: x = 2, y = 6, z = 5
输出:
False
这不是五分钟能解决的了==,花了一小时看贝祖定理没看明白,数学好菜
首先先给一个贝祖定理的结论
当存在ax+by=z时,当且仅当x,y的最大公约数是z的倍数时有解(看了一小时也没看明白贝祖定理的证明==)
对于水壶问题我们可以这样认为,每次操作过后,水壶的总量的水只是增加x,减少x或者增加y ,减少y,如果你把部分水倒掉或将部分水填满,比如x桶 2升,y桶0升,如果我们对x桶进行操作,有两种可能:
倒满,那么就和把一个空的x桶倒满是一样的结果
倒空,那么就和最开始的x什么都不动是一样的结果
这里可能有点绕,我们尝试简述一下。
我们先引入两个变量y_now和x_now,这两个变量代表某一时刻x,y两瓶里剩余的水量。
首先我们的目的是获得x_now+y_now=z(x_now和y_now都可以为0),也就是说我们在某一时刻发现两瓶水的总量是z,那么问题就解决了。而总量出现部分水(即当前总量并不是x,y,x+y,零,下文同)的情况满足以下几个条件
1:当出现了部分水的情况时,至少有一个瓶子存在着不满不空的状态(全满,全空,一满一空都不符合部分水的前提)
2:不发生任何瓶子转移的情况,不会出现部分水(永远不往另一个瓶子里倒,只有满或者空)
3:两个瓶子不会同时出现不满不空的情况