萌新求助,大红大紫

P1215 [USACO1.4] 母亲的牛奶 Mother's Milk

~~dfs是魔鬼吧~~(不是指您,指算法)
by LuV_Studio @ 2020-08-13 17:12:48


@[无敌的蒟蒻](/user/151647) 你看看,我给你改好了,不要上来就抄,先看看,我也调了好久好久才调好: ```cpp #include <bits/stdc++.h> using namespace std; int aa, bb, cc; int ans[1000001], anslen = 0; bool vis[50][50][50]; inline void dfs(int a, int b, int c) { // cout << a << ' ' << b << ' ' << c << endl; if (vis[a][b][c]) { // 确保每个 (a, b, c) 只被 dfs 一次 // cout << "return " << endl; return ; } vis[a][b][c] = 1; if (a == 0) { ans[anslen++] = c; } if (a != 0) { // 如果 a 里面还有牛奶 if (b + a <= bb) { // cout << "1 - 1 : " << 0 << ' ' << b + a << ' ' << c << endl; dfs(0, b + a, c); } if (b + a > bb) { // cout << "1 - 2 : " << a - bb + b << ' ' << bb << ' ' << c << endl; dfs(a - bb + b, bb, c); } if (c + a <= cc) { // cout << "1 - 3 : " << 0 << ' ' << b << ' ' << c + a << endl; dfs(0, b, c + a); } if (c + a > cc) { // cout << "1 - 4 : " << a - cc + c << ' ' << b << ' ' << cc << endl; dfs(a - cc + c, b, cc); } } if (b != 0) { // 如果 b 里面还有牛奶 if (a + b <= aa) { // cout << "2 - 1 : " << a + b << ' ' << 0 << ' ' << c << endl; dfs(a + b, 0, c); } if (a + b > aa) { // cout << "2 - 2 : " << aa << ' ' << b - aa + a << ' ' << c << endl; dfs(aa, b - aa + a, c); } if (c + b <= cc) { // cout << "2 - 3 : " << a << ' ' << 0 << ' ' << c + b << endl; dfs(a, 0, c + b); } if (c + b > cc) { // cout << "2 - 4 : " << a << ' ' << b - cc + c << ' ' << cc << endl; dfs(a, b - cc + c, cc); } } if (c != 0) { // 如果 c 里面还有牛奶 if (a + c <= aa) { // cout << "3 - 1 : " << a + c << ' ' << b << ' ' << 0 << endl; dfs(a + c, b, 0); } if (a + c > aa) { // cout << "3 - 2 : " << aa << ' ' << b << ' ' << c - aa + a << endl; dfs(aa, b, c - aa + a); } if (b + c <= bb) { // cout << "3 - 3 : " << a << ' ' << b + c << ' ' << 0 << endl; dfs(a, b + c, 0); } // cout << b << ' ' << c << ' ' << bb << endl; if (b + c > bb) { // cout << "NOW : " << a << ' ' << b << ' ' << c << endl; // cout << "3 - 4 : " << a << ' ' << bb << ' ' << c - bb + b << endl; dfs(a, bb, c - bb + b); } } } int main() { cin >> aa >> bb >> cc; dfs(0, 0, cc); sort(ans, ans + anslen); for (int i = 0; i < anslen; ++i) { cout << ans[i] << ' '; } cout << endl; } ```
by littlefrog @ 2021-03-04 10:35:18


|