~~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