深度优先搜索(depth-first-search)简称 dfs,应该算是应用得最广泛的搜索算法,也是竞赛中经常考察的一个难点。dfs 按照深度优先的方式搜索,通俗的说就是一条路走到黑。dfs 是一种穷举的手段,实际上就是把所有的可行方案列举出来,不断去试探,直到找到问题的解,其过程是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
dfs 是一种搜索算法,dfs 一般的实现方法是借助递归。
void dfs(int deep) {
if (到达边界) {
// 做一些处理后返回
} else {
for(所有可能的选择) {
dfs(deep + 1);
}
}
}
上面是 dfs 的一般的写法。
dfs 和递归的区别是,dfs 是一种算法,注重的是思想,而递归是编程语言的一种写法。我们通过递归的写法来实现 dfs。 在之前我们讲到的递归每个节点最多只有 2 个分支,而在接下来的 dfs 中,每个节点可以扩展出很多个分支。
例题洛谷P2089
题目背景
猪猪hanke得到了一只鸡
题目描述
猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和
现在,Hanke想要知道,如果给你一个美味程度,请输出这