365. Water and Jug Problem

題意:
給定兩個容量分別為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;
}

總結:數學真的很重要啊,從這代碼量就能看出來了啊

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容