求助,答案会少几个项

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

@[FincheuwYggdrasil](/user/551088) 问题找着了 在你递归调用dfs函数的时候,你在调用函数前执行了`m[i] -= mimi, m[j] += mimi;`语句,因此当你在调用函数后,你需要进行回溯操作,不然之后遍历下去的结果就会出问题。 你需要做的是在dfs函数调用之后恢复状态,即插入`m[i] += mimi, m[j] -= mimi;`该行代码即可。 修改后的代码如下: [AC提交记录](https://www.luogu.com.cn/record/121892791) ``` cpp #include<iostream> #include <algorithm> using namespace std; int m[3], n[3]; bool vis[40], stp[30][30][30]; void dfs() { if(stp[m[0]][m[1]][m[2]]) { return ; }stp[m[0]][m[1]][m[2]] = 1; if(!m[0] && !vis[m[2]]) { vis[m[2]] = 1; } for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { if(i == j) continue; int mimi = min(n[j] - m[j], m[i]); m[i] -= mimi, m[j] += mimi; dfs(); m[i] += mimi, m[j] -= mimi; } } } int main() { // ofstream cout ("milk3.out"); // ifstream cin ("milk3.in"); cin >> n[0] >> n[1] >> n[2]; m[0] = 0, m[1] = 0, m[2] = n[2]; //stp[m[0]][m[1]][m[2]] = 1; dfs(); for(int i = 0; i <= 21; i++) { if(vis[i]) { cout << i << " "; } } cout << endl; return 0; } ```
by Macw07 @ 2023-08-20 11:57:20


@[Macw07](/user/866133) 我已经通过了这题,但还是感谢你!
by FincheuwYggdrasil @ 2023-08-20 18:55:39


|