今天的题目是365. Water and Jug Problem。
我们可以执行的操作有三种:
- 给一个杯子装满
- 倒掉一个杯子中的所有水
- 将一个杯子中的水转移到另一个杯子中直到没水或者另一个杯子装满
三种操作会分别让两个杯子总水量产生三种:
- 增加
x
或y
- 减少
x
或y
- 总量不变
上面的说法是没有考虑向一个未空的杯子中加水或者是从一个未空的杯子中加水的情况,因为这样的操作显然是没有意义的。
因此杯子中的总水量可以用ax+by
表示,其中a
和b
都是整数。此时问题转换为是否存在a
和b
使得ax+by=z
。根据裴蜀定理,我们可以用z % gcd(x,y)
来判断。
代码如下:
1int gcd(int x,int y) {2 return x % y == 0 ? y : gcd(x, x % y);3}4bool canMeasureWater(int x, int y, int z) {5 if (x == 0 && y == 0) return z == 0;6 if (x + y < z) return false;7 if (x > y) swap(x, y); // y >= x8 int d = x ? gcd(y, x) : y;9 return (z % d == 0);10}