《算法笔记》读书记录DAY_28

CHAPTER_8  提高篇(2)——搜索专题

8.1 深度优先搜索(DFS)

深度优先搜索是用来遍历或搜索树和图数据结构的算法,它是可以从任意节点开始,选择一条路径走到底,并通过回溯来访问所有节点的算法。简单来说就是通过选择一条道路走到无路可走的时候回退到上一个岔路口,并标记这条路已走过,选择另外一条道路继续走,直到走遍每一条路。

深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点。
初始条件下所有节点为白色,选择一个作为起始顶点,按照如下步骤遍历:
a. 选择起始顶点涂成灰色,表示还未访问
b. 从该顶点的邻接顶点中选择一个,继续这个过程(即再寻找邻接结点的邻接结点),一直深入下去,直到一个顶点没有邻接结点了,涂黑它,表示访问过了
c. 回溯到这个涂黑顶点的上一层顶点,再找这个上一层顶点的其余邻接结点,继续如上操作,如果所有邻接结点往下都访问过了,就把自己涂黑,再回溯到更上一层。
d. 上一层继续做如上操作,知道所有顶点都访问过。

如下图,我们从结点1开始按照DFS算法遍历所有结点。

  

我们可以看到,递归和回溯是DFS算法的重要思想,这种思想我们已经在前面的全排列八皇后问题中介绍过。实际上,程序在递归时,系统会调用一个叫系统栈的东西来存放每一层递归的状态,所以递归的本质上还是栈。因此,DFS算法可以通过递归和非递归(栈)两种方式来实现。

我们在此不阐述DFS的图遍历算法本身,而注重DFS的思想以及应用。接下来我们通过一个例题来理解递归与回溯的思想。

题目:

有n件物品,每件物品重量为w[i],价值为c[i]。现在需要选出若干物品放入背包,背包容量为v,使得放入背包物品的重量不超过v的情况下,让背包中物品的价值最大。并输出最大价值。

扫描二维码关注公众号,回复: 13291352 查看本文章

输入格式:

每个输入包含一个测试用例。每个用例有三行,第一行给出物品数量n和背包容量v,第二行分别给出n件物品的重量,第三行分别给出n件物品的价值。每行中的数据有空格分隔,所有输入数据均为正整数。

输出格式:

输出最大价值。

输入样例:

5 8

3 5 1 2 2

4 5 2 1 3

输出样例:

10

思路: 

我们选择用递归的方式来解决问题。首先我们设立一个全局变量记录最大价值和。

我们对n件物品分别处理,每件物品有2种处理方式:选择或者不选择。这实际上就是DFS中的选路,我们从两个分岔路中选一条,进入该分岔路走到无路可走时,回到上个出口选择另一条进入,这就是回溯。

假设我们当前处理第index件物品,DFS函数可按如下编写:如果index等于n,说明n件物品已经处理完,直接返回上一层。接下来我们做出两个分支选择,不选择第index件物品而进入下一层,选择第index件物品而进入下一层。而在第二分支中,我们要先判断总重量是否已经超过v,如果没有超过v才可以进入第二个分支,进入第二个分支时更新当前重量和当前价值,然后进入下一层。通过一层层的递归,我们用判断条件来更新最大价值。

参考代码:

#include <iostream>

using namespace std;
const int maxn=101;
int n,v,ans=0,w[maxn],c[maxn];          //n为物品数,v为背包容量,ans记录最大价值和,w存储物品重量,c存储物品价值 

void DFS(int index,int sumW,int sumC) {
	if(index==n) {                      //处理完n件,返回上一层 
		return;
	}
	DFS(index+1,sumW,sumC);             //进入第一个分支
	if(sumW+w[index]<=v) {              //进入第二个分支 
		sumW+=w[index];                 //更新当前重量 
		sumC+=c[index];                 //更新当前价值和
		if(sumC>ans)                    //更新最大价值 
			ans=sumC;
		DFS(index+1,sumW,sumC);         //处理下个物品 
	}    
}

int main() {
	cin>>n>>v;
	for(int i=0;i<n;i++) {
		cin>>w[i];
	}
	for(int i=0;i<n;i++) {
		cin>>c[i];
	}
	DFS(0,0,0);
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jgsecurity/article/details/120757918
今日推荐