题目:
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空
这道题的解法在于证明Z可以被X和Y的最大公约数整除,下面是该定理的证明:
假设最终体积z = m * x + n * y(m与n为整数,可以为0或者为负)
令x = p * gcd, y = q * gcd,可知p与q互质。
则z = (m * p + n * q) * gcd
可以证明一定存在m, n,使得m * p + n * q = 1(p与q互质的性质,参见:裴蜀定理)
由此可知z一定是gcd的整数倍
class Solution {
public:
bool canMeasureWater(int x, int y, int z) {
if(z==0)
return true;
if(x==0)
return z==y;
if(y==0)
return z==x;
int m=max(x,y);
int n=min(x,y);
if(z>m+n)
return false;
while(m%n!=0){
int rem=m%n;
m=n;
n=rem;
}
return z%n==0;
}
};