題意:
給定兩個容量分別為x和y升的罐子。提供無限容量的水。你需要判斷用這兩個罐子是否可以恰好量出z升的體積。到最后量出的z升體積可以由一到兩個罐子裝著。
允許的操作包括:
1、將任意罐子灌滿。
2、將任意罐子清空。
3、將任意罐子的水倒入另一個罐子,直到另一個罐子倒滿或者自己為空為止。
方法一:我自己的解法(不能保證正確)
void increse(set<int>& s, int x, int y) {
int size = s.size();
auto items2 = s;
for(auto var = items2.begin(); var != items2.end(); var++)
{
int newx = x - *var;
int newy = y - *var;
if (newx > 0)s.insert(newx);
if (newy > 0) s.insert(newy);
}
if (size != s.size()) increse(s, x, y);
}
bool canMeasureWater(int x, int y, int z) {
if (z > x + y) return false;
if (z == x + y) return true;
if (x < y) {
int temp = x;
x = y;
y = temp;
}
set<int> items;
for (int i = x - y; i > 0 && y != 0; i -= y) {
items.insert(i);
}
increse(items, x, y);
for(auto var = items.begin(); var != items.end(); var ++)
{
if (*var + x == z || *var + y == z) return true;
}
return false;
}
方法二:利用數學知識,判斷z是否為x,y的最大公約數的倍數
int gcd(int p, int q) {
return q == 0 ? p : gcd(q, p % q);
}
bool canMeasureWater2(int x, int y, int z) {
if (z > x + y) return false;
if (z == 0) return true;
return z % gcd(x, y) == 0 ? true : false;
}
總結:數學真的很重要啊,從這代碼量就能看出來了啊