算法笔记中给出了深度优先搜索的的讲解和两个例题,方便复习将内容总结如下:
一、什么是DFS
设想处于一个巨大的迷宫中,从起点开始,沿着一条路一直走,当遇到岔路口时就选择一条路前进。如果这条路前面是一条死胡同,则退回之前的岔路口选择另外一条路;如果这条路前面是另一个岔路口,仍然选择一条路走,直到遇见死胡同为止。
这种方法枚举所有的路径遍历所有的情况以找到最优解。
利用递归求解fibonacci数列的过程可以看作DFS。对于递归式F(n)=F(n-1)+F(n-2),F(n)可以理解为岔路口,F(n-1)和F(n-2)就可以理解为这个岔路口的两条路。F(0)和F(1)是递归终点,可以看作死胡同。
DFS的本质是栈,因此可以利用递归实现,且利用递归实现会更加简单。
二、实例1
有n件物品,每件物品的重量为w[i],价值为c[i]。选出若干件物品放到一个容量为V的背包中,在容量允许的情况下,让背包中物品的价值总和最大(1<=n<=20)
输入实例:
5 8
3 5 1 2 2
4 5 2 1 3
输出实例:
10
/*
每个物品都有两个选项,放入背包和不放入背包
*/
#include<iostream>
using namespace std;
int n, V, w[25], c[25];
int maxCost = 0;
//k为当前物品的标号,sumw为当前背包中物品重量,sumc为当前背包中物品价值
void DFS(int k, int sumw, int sumc)
{
//当n个物品全部遍历结束,返回
//【注:这里是n而不是n-1,当k=n-1时仍需要进入下一轮递归,并在下一轮递归返回】
if (k == n)
{
return;
}
//选项一,不放入物品k
DFS(k + 1