首页 > 其他 > 详细

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

时间:2018-10-07 12:41:46      阅读:250      评论:0      收藏:0      [点我收藏+]

深度优先搜索

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

例题

给你一副扑克中的 \(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]]);

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

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

原文:https://www.cnblogs.com/Tony-Double-Sky/p/9749785.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!