365. Water and Jug Problem
You are given two jugs with capacitiesx andy litres. There is an infinite amount of water supply available.You need to determine whether it is possible to measure exactlyz litres using these two jugs.If z liters of water is measurable, you must havez liters of water contained withinone or both buckets by the end.
Operations allowed:
- Fill any of the jugs completely with water.
- Empty any of the jugs.
- Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.
Example 1: (From the famous "Die Hard" example)
Input: x = 3, y = 5, z = 4
Output: True
Example 2:
Input: x = 2, y = 6, z = 5
Output: False
给定两个容量分别为x和y升的罐子。提供无限容量的水。你需要判断用这两个罐子是否可以恰好量出z升的体积。到最后量出的z升体积可以由一到两个罐子装着。
允许的操作包括:
1、将任意罐子灌满。
2、将任意罐子清空。
3、将任意罐子的水倒入另一个罐子,直到另一个罐子倒满或者自己为空为止。
思路:
求最大公约数GCD(Greatest Common Divisor)。
如果x与y互质(最大公约数为1),则容量范围[1, max(x, y)]之内的任意整数体积均可以通过适当的操作得到。
否则,记x与y的最大公约数为gcd,则可以获得的容量z只能为gcd的整数倍,且z <= max(x, y)。
public boolean canMeasureWater(int x, int y, int z) {
// 最后可量的水可以装在一个或者两个罐子内
if (z > x + y)
return false;
if (z == 0)
return true;
int res = gcd(x, y);
return z % res == 0;
}
// 递归求最大公约数
private int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
}
// 迭代
public int gcd(int x, int y) {
while (y != 0) {
int temp = y;
y = x % y;
x = temp;
}
return x;
}
参考:http://blog.csdn.net/aishangyutian12/article/details/51762532