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==mu==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;
}
posted @ 2024-03-18 11:10  光風霽月  阅读(13)  评论(0编辑  收藏  举报