Tony的口胡呼呼(。-ω-)zzz

深度优先搜索

从起始状态少的一侧开始搜索更优

例题

给你一副扑克中的 \(n\) 张牌, 出的下一张牌需要为前面出牌点数之和的约数, 求一种合法的方案

此题正向搜索代码如下:

void dfs(int depth, int sum){
    if(depth == n){
        output();
        return ;
        }
    REP(i, 1, n){
    if(!vis[i] && sum % a[i] == 0){
        vis[i] = 1;
        dfs(depth + 1, sum + a[i]);
        vis[i] = 0;
        }
    }
}

显然初始分支很多, 考虑逆向搜索

void dfs(int depth, int left){
    if(depth == 0){output();return ;}
    REP(i, 1, n){
    if(!vis[i] && (left - a[i]) % a[i] == 0){
        vis[i] = 1;
        dfs(depth - 1, left - a[i]);
        vis[i] = 0;
        }
    }
}
//调用
dfs(n, sum[a[i]]);

初始分支减少, 搜索量减少

猜你喜欢

转载自www.cnblogs.com/Tony-Double-Sky/p/9749785.html
zzz