内容:
- 深度优先搜索简介
- 背包问题
- 剪枝
1、深度优先搜索简介
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法。
- 有明确的搜索目标;
- 存在到达目标的路径;
- 路径中存在结点,每个结点存在一个或以上的分叉口;
深度优先搜索的实现方法——递归法
- 递归中的递归式就是那个分叉口;
- 递归边界就是那个目标;
2、背包问题
#include<iostream>
using namespace std;
const int maxn=30;
int n,v,max=0;
int w[maxn],c[maxn];
void DFS(int index,int sumW,int sumC){
if(index==n){
if(sumW<=v&&sumC>max){
max=sumC;
}
return;
}
DFS(index+1,sumW,sumC);//不选第index件物品
DFS(index+1,sumW+w);//选第index件物品
}
可以注意到,由于每个物品都会有两种选择方案,因此上面的代码的时间复杂度是O(2^n);是以指数函数增长的,那是十分巨大的。
于是,我们需要通过对算法优化来使其在随机数据的表现上有更好的效率。
void DFS(int index,int sumW,int sumC){
if(index==n){
return;
}
DFS(index+1,sumW,sumC);//不选第index件物品
if(sumW+w[index]<=v){
if(sumC+c[index]>ans){
ans=sumC+c[index];
}
DFS(index+1,sumW+w[index],sumC+c[index]);//选第index件物品
}
}