问题

英文

You are given two jugs with capacities x and y litres. There is an infinite amount of water supply available. You need to determine whether it is possible to measure exactly z litres using these two jugs.

If z liters of water is measurable, you must have z liters of water contained within one or both buckets by the end.

Operations allowed:

Fill any of the jugs completely with water.
Empty any of the jugs.
Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.
Example 1: (From the famous “Die Hard” example)

Input: x = 3, y = 5, z = 4
Output: True
Example 2:

Input: x = 2, y = 6, z = 5
Output: False

中文

有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?

如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

你允许:

装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空
示例 1: (From the famous “Die Hard” example)

输入: x = 3, y = 5, z = 4
输出: True
示例 2:

输入: x = 2, y = 6, z = 5
输出: False

分析

需要满足条件:
1.两个杯子,如果z>x+y说明两个杯子无法满足。
2.如果z=0,则直接返回true;
3.如果a||b有一个为0,则另一个一个不等于z时返回false
4.ax+by=z,根据这个公式可知,如果z是a,b的最大公约数的整数倍。

所以该问题可以转化为 z%gcd(x,y) == 0的问题。

疑问

以为一定要是gcd,而不能是公约数呢?(裴蜀定理)
如何证明???

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
function canMeasureWater($x, $y, $z) {
//排除为0的情况
if($z == 0) {
return true;
}
if($x == 0 && $y == 0)
{
return false;
}
//设$x为大 $y为小
if($x<$y)
{
$x = $x+$y;
$y= $x-$y;
$x = $x - $y;
}
if($x < 0)
{
return ($y==$z);
}
if($y != 0)
{
if($z==$x || $z==$y|| $x+$y==$z || $x-$y == $z)
{
return true;
}
if($x+$y< $z) {
return false;
}
while($x%$y != 0)
{
$tmp = $x;
$x = $y%$x;
$y = $tmp;
}
return ($z%$y==0);
} else {
if($z%$x==0) {
return true;
}
}
return false;
}
}