leetcode 365. Water and Jug Problem

题目链接
题目大意:

给你两个壶,通过以下操作是否能够得到指定的水量:
1. 装满任意一个壶
2. 倒空任意一个壶
3. 从一个壶向另一个壶倒水,直到某个壶满了或者空了

思路:
  1. 首先想到的是用递归。两个壶的水量是状态,通过三种操作来进行状态转移。可能是因为需要考虑的比较多,总之是写挫了,放弃了这种想法。
  2. 看了一下题解可以把问题 转换为 a x + b y = z 是否有解的问题。
    为什么可以进行这样的转化呢?因为题意中的三种操作导致的两壶总水量都可以通过改变 a b 来实现。
    • 装满任意一个壶: + + a + + b
    • 倒空任意一个壶: a b
    • 从一个壶向另外一个壶倒: + + a , b a , + + b a b

那么如何判断 a x + b y = z 是否有解呢,这就需要用到裴蜀定理了。
结合到这道题目, a x + b y = z 有解的充要条件是: g d c ( 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 以及 g c d ( a , b ) == 0 a == b == 0 的情况

其他做法:DFS & BFS

猜你喜欢

转载自blog.csdn.net/guojunxiu/article/details/81630862