dfs的return时机问题
题目链接
错误代码的 \(dfs\) 方式:
void dfs(int u, int cnt)
{
if(u == n) return ;
if(n - u + cnt < m) return ;
if(cnt == m) // 再往下dfs没有意义了,剪枝
{
dp();
return ;
}
dfs(u + 1, cnt);
del[u] = true;
dfs(u + 1, cnt + 1);
del[u] = false;
}
在这份代码中,我们将 if(cnt==m)
的判断放在了 if(u == n)
和 if(n - u + cnt < m)
之后,这就会导致一个问题,那就是当某次 \(dfs\) 同时满足 cnt==m
和 u==n
时,会直接先 \(return\) 掉,而不会执行 dp()
,从而漏解
正确的做法应该是,在递归当中 \(return\) 时,先 \(return\) 有解的情况,确保走到无解 \(return\) 语句时,一定不会有解。
正确的 \(dfs\) 代码
void dfs(int u, int cnt)
{
if(cnt == m) // 再往下dfs没有意义了,剪枝
{
dp();
return ;
}
if(u == n) return ;
if(n - u + cnt < m) return ;
dfs(u + 1, cnt);
del[u] = true;
dfs(u + 1, cnt + 1);
del[u] = false;
}