DFS-算法笔记总结

算法笔记中给出了深度优先搜索的的讲解和两个例题,方便复习将内容总结如下:

一、什么是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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值