第八章——搜索专题
作者:互联网
8.1 深度优先搜索
深度优先搜索是一种枚举所有完整路径以遍历所有结点的情况。
使用递归可以很好的实现深度优先搜索。
例:有n件物品,每件物品重w[i],价值为c[i],把物品放入容器为V的背包中,让容量不超过V的前提下,求最大的价值。
如果不放入第index件物品,sumW和sumV不变,dfs(index+1,sumW,sumV)。
如果选择放入第index件物品,dfs(index+1,sumW+w[index],sumV+c[index]);
一旦index等于n就是处理完了,求sumW<=V,求sumV最大
#include<cstdio>
const int maxn=30;
int n,V,maxvalue=0;
int w[maxn],c[maxn];
void dfs(int index,int sumW,int sumC){
if(index==n){
if(sumW<=V&&sumC>maxvalue)
maxvalue=sumC;
return;
}
dfs(index+1,sumW,sumC);
dfs(index+1,sumW+w[index],sumC+c[index]);
}
int main (){
scanf("%d%d",&n,&V);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
dfs(0,0,0);
printf("%d\n",maxvalue);
return 0;
}
上述代码中只考虑index==n才确定最大值,忽略容量不超过V的特点。
void dfs(int index,int sumW,int sumC){
if(index==n)
return;
dfs(index+1,sumW,sumC);
if(sumW+w[index]<=V){
if(sumC+c[index]>ans)
ans=sumC+c[index];
dfs(index+1,sumW+w[index],sumC+c[index]);
}
}
通过题目条件的限制来节省dfs的计算,叫做剪枝。
标签:index,专题,int,第八章,sumW,件物品,搜索,dfs,sumC 来源: https://blog.csdn.net/qq_43721152/article/details/99767349