题目链接:水壶问题
题意:有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空
题解:有一个定理叫做裴蜀定理。熟悉数论的应该都知道这个定理。
对任何整数 a、b和它们的最大公约数 d ,关于未知数 x 和 y 的线性丢番图方程。
有一个最著名的推论就是:ab互质的充要条件是存在整数x,y使得ax+by = 1
而这个题就是这个定理的运用。只要满足z%gcd(a,b) == 0即可。
(吐槽一下样例,给了0,0,0和1,0,0我不知道是个什么鬼。。脱离实际情况出数据可还行。)
还有一定要满足x+y >= z
代码:
1 class Solution { 2 public: 3 int gcd(int a,int b){ 4 if(b == 0) return a; 5 return gcd(b,a%b); 6 } 7 bool canMeasureWater(int x, int y, int z) { 8 if(x == 0) return y == z; 9 if(z == 0) return true; 10 if(x+y < z) return false; 11 12 int ans = gcd(x,y); 13 14 if(z%ans) return false; 15 else return true; 16 } 17 };