算法笔记第八章 深搜和广搜

本文详细介绍了深度优先搜索(DFS)和广度优先搜索(BFS)两种算法。在DFS中,通过递归解决背包问题,并利用剪枝和临时数组优化。BFS则通过队列实现,如迷宫问题,注意队列中仅存储下标。同时,文章提到了DFS在三维数组求体积问题的应用。
摘要由CSDN通过智能技术生成

算法笔记第八章 深搜和广搜

深度优先搜索

碰到岔路口就递归,碰到死胡同就是递归边界
例子:
背包问题:n个物品,每件重量给了,价值给了,不超重的前提下,怎么拿更值钱。
思路:首先参数:当前在哪一号物品上,然后,当前的价值,当前的重量。

//先想一想思路:如果东西只有一件,那么价值就是他本身,如果东西有多件
//那么就可以选择选这件东西,或者不选这件东西,当到死胡同,判断是否更新最大值

#include<cstdio>

int n,v;//放总共有多少个物品和背包总共可以放多沉
int maxvalue=0;
int w[25],c[25];

int beg (int index,int value,int weight){
   
	if(index==n){
   
		if(value>maxvalue && weight<=v) maxvalue=value;//到达底部并且不超出背包范围,才要更新
		return; //只需要返回,不需要返回值
	}
	beg(index+1,value,weight);//不选index号
	beg(index+1,value+c[index],weight+w[index]);//选index号,因为index滞后一个位,所以添加重量时不加一
}

但是可以改进一下,因为第二条路没有判断是不是超出了重量就进去了,这种思路就叫做剪枝

//先想一想思路:如果东西只有一件,那么价值就是他本身,如果东西有多件
//那么就可以选择选这件东西,或者不选这件东西,当到死胡同,判断是否更新最大值

#include<cstdio>
#include<cstdlib>

int n,v;//放总共有多少个物品和背包总共可以放多沉
int maxvalue;
int w[25],c[25];

void beg (int index,int value,int weight){
   
	if(index==n){
   
		return; //只需要返回,不需要返回值
	}
	beg(index+1,value,weight);//不选index号
	if(weight+w[index]<=v){
   //只有选了才有可能更新最大值
		if(value+c[index]>maxvalue) maxvalue=value+c[index];///到达底部并且不超出背包范围,才要更新
		beg(index+1,value+c[index],weight+w[index]);//选index号,因为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",&c[i]);
	}
	beg(0,0,0);
	printf("%d\n",maxvalue);
	system("pause");
	return 0;
}

这有个问题就是如何保存我们选到的方案
还是更新的思路,所以有一个临时的数组先放着,当价值确实更大的时候,更新给结果数组,为了方便插入删除和赋值,用vector

//先想一想思路:如果东西只有一件,那么价值就是他本身,如果东西有多件
//那么就可以选择选这件东西,或者不选这件东西,当到死胡同,判断是否更新最大值

#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;

int n,v;//放总共有多少个物品和背包总共可以放多沉
int maxvalue;
int w[25],c[25];
vector<int> temp,ans;

void beg (int index,int value,int weight){
   
	if(index==n){
   
		return; //只需要返回,不需要返回值
	}
	beg(index+1,value,weight);//不选index号
	if(weight+w[index]<=v){
   //只有选了才有可能更新最大值
		temp.push_back(index+1);
		if(value+c[index]>maxvalue){
   
			maxvalue=value+c[index];///到达底部并且不超出背包范围,才要更新
			ans=temp;
		}
		beg(index+1,value+c[index],weight+w[index]);//选index号,因为index滞后一个位,所以添加重量时不加一
		temp.pop_back();//为了不影响不放入的那条线,所以要用完了pop出来
	}
}

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(
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值