题目链接
题目大意:
给你两个壶,通过以下操作是否能够得到指定的水量:
1. 装满任意一个壶
2. 倒空任意一个壶
3. 从一个壶向另一个壶倒水,直到某个壶满了或者空了
思路:
- 首先想到的是用递归。两个壶的水量是状态,通过三种操作来进行状态转移。可能是因为需要考虑的比较多,总之是写挫了,放弃了这种想法。
- 看了一下题解可以把问题 转换为
ax+by=z
a
x
+
b
y
=
z
是否有解的问题。
为什么可以进行这样的转化呢?因为题意中的三种操作导致的两壶总水量都可以通过改变 a和b a 和 b 来实现。
- 装满任意一个壶: ++a或者++b + + a 或 者 + + b
- 倒空任意一个壶: −−a或者−−b − − a 或 者 − − b
- 从一个壶向另外一个壶倒: ++a,−−b或−−a,++b或a、b不变 + + a , − − b 或 − − a , + + b 或 a 、 b 不 变
那么如何判断
ax+by=z
a
x
+
b
y
=
z
是否有解呢,这就需要用到裴蜀定理了。
结合到这道题目,
ax+by=z
a
x
+
b
y
=
z
有解的充要条件是:
gdc(a,b)|z
g
d
c
(
a
,
b
)
|
z
,即
a和b的最大公约数整除z
a
和
b
的
最
大
公
约
数
整
除
z
给出AC代码:
class Solution {
public:
bool canMeasureWater(int x, int y, int z) {
return (z==0) || (x+y>=z && z%gcd(x,y)==0);
}
int gcd(int x, int y){
return y==0 ? x : gcd(y, x%y);
}
};
需要注意 x+y>=z x + y >= z 以及 gcd(a,b)==0 g c d ( a , b ) == 0 即 a==b==0 a == b == 0 的情况
其他做法:DFS & BFS