题目链接
题目大意:
给你两个壶,通过以下操作是否能够得到指定的水量:
1. 装满任意一个壶
2. 倒空任意一个壶
3. 从一个壶向另一个壶倒水,直到某个壶满了或者空了
思路:
- 首先想到的是用递归。两个壶的水量是状态,通过三种操作来进行状态转移。可能是因为需要考虑的比较多,总之是写挫了,放弃了这种想法。
- 看了一下题解可以把问题 转换为
是否有解的问题。
为什么可以进行这样的转化呢?因为题意中的三种操作导致的两壶总水量都可以通过改变 来实现。
- 装满任意一个壶:
- 倒空任意一个壶:
- 从一个壶向另外一个壶倒:
那么如何判断
是否有解呢,这就需要用到裴蜀定理了。
结合到这道题目,
有解的充要条件是:
,即
给出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);
}
};
需要注意 以及 即 的情况
其他做法:DFS & BFS