Leetcode 365 水壶问题 (扩展欧几里得)

题目描述:

  有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

  你允许:

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 从一个水壶向另外一个水壶倒水,直到装满或者倒空

题解:

  题目允许的三个操作,分别对应+x,+y,+(max(x,y)-min(x,y))。根据贝祖定理(扩展欧几里得)有ax+by=gcd(a,b)。也就是说,如果z为gcd(a,b)的倍数的话,就有解。

由于题目还有一个限制--选择x,y两个水壶中的一个或者两个来盛水。使用x,y最多能够盛x+y升的水,加一个判断就好了。

 

AC代码:

  

class Solution {
public:
    int gcd(int x,int y)
    {
        if(y == 0) return x;
        return gcd(y,x%y);
    }
    bool canMeasureWater(int x, int y, int z) {
        int g = gcd(x,y);
        if(x+y < z ) return false;
        if(x == 0 && y == 0)
        {
            if(z == 0 )return true;
            return false;
        }
        if(x == 0 ) g = y;
        if(y == 0) g = x;
        if(z%g == 0) return true;

        return false;
    }
};

 

posted @ 2020-03-31 10:19  猪突猛进!!!  阅读(276)  评论(0编辑  收藏  举报