深度优先搜索

深度优先搜索:从起点开始,当碰到岔道口时,总是选择其中一条岔路前进,在岔路上如果又遇到新的岔道口,仍然选择新岔道口的其中一条岔路前进,直到碰到死胡同才回退到最近的岔道口选择另一条岔路。(不碰到死胡同就不回头)

深度优先搜索是一种枚举所有完整路径以遍历所有清空的搜索方法。

使用递归可以很好地实现深度优先搜索,系统会调用一个叫系统栈的东西来存放递归中每一层的状态,因此使用递归来实现DFS的本质还是栈。

例题

有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干物件放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价值之和最大,求最大值(1<=n<=20)

分析

对每件物品都有选或者不选两种选择,而这就是所谓的“岔道口”。题目要求选择的物品重量总和不能超过V,一旦超过就会到达“死胡同”,需要返回最近的“岔道口”。
DFS函数的参数中必须记录当前处理的物品编号index,已选物品的总重量sumV与总价值sumC。

void DFS(int index, int sumW, int sumC){...}

如果选择不放入index号物品,那么sumW与sumC就将不变
接下来处理index+1号物品,即前往DFS(index+1, sumW, sumC)这条分支
如果选择放入index号物品,那么sumW将增加当前物品的重量w[index],sumC将增加当前物品的价值c[index]
接着处理index+1号物品,即前往DFS(index+1, sumW+w[index], sumC+c[index])这条分支

一旦index增长到n,则说明已经把n件物品处理完毕,此时记录的sumW和sumC就是所选物品的总重量和总价值。
如果sumV不超过V且sumC大于一个全局的记录最大总价值的变量maxValue,就说明当前方案可以得到更大价值,用sumC更新maxValue。

#include <cstdio>
const int maxn = 30;
int n, V, maxValue = 0; //物品件数n,背包容量V,最大价值maxValue
int w[maxn], c[maxn]; //w[i]为每件物品的重量,c[i]为每件物品的价值
//DFS,index为当前处理的物品编号
//sumW,sumC分别为当前总重量和当前总价值
void DFS(int index, int sumW, int sumC)
{if(index == n) //已经完成对n件物品的选择(死胡同){if(sumW <= V && sumC > maxValue){maxValue = sumC; //不超过背包容量时更新最大价值maxValue}return;}//岔道口DFS(index + 1, sumW, sumC); //不选第index件物品DFS(index + 1, sumW + w[index], sumC + c[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]); //每件物品的价值}DFS(0, 0, 0); //初始时为第0件物品,当前总重量和总价值均为0printf("%d\n", maxValue);return 0;
}
//输入
5 8 //5件物品,背包容量8
3 5 1 2 2 //重量分别为3 5 1 2 2
4 5 2 1 3 //价值
10 //输出结果

上述代码,总是把n件物品的选择全部确定之后才去更新最大价值,但事实上忽视了背包容量不超过V这个特点。
可以只有当sumW<=V时才进入岔道。可以降低计算量(剪枝)

void DFS(int index, int sumW, int sumC)
{if(index == n){return; //已经完成对n件物品的选择}DFS(index + 1, sumW, sumC); //不选第index件物品//只有加入第index件物品后未超过容量V,才能继续if(sumW + w[index] <= V){if(sumC + c[index] > ans){ans = sumC + c[index]; //更新最大价值maxValue}DFS(index + 1, sumW + w[index], sumC + c[index]); //选第index件物品}
}

深度优先搜索(DFS)相关推荐

  1. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  2. C++实现深度优先搜索DFS(附完整源码)

    C++实现深度优先搜索DFS C++实现深度优先搜索DFS完整源码(定义,实现,main函数测试) C++实现深度优先搜索DFS完整源码(定义,实现,main函数测试) #include <al ...

  3. C++用stack实现深度优先搜索DFS(附完整源码)

    C++用stack实现深度优先搜索DFS的实现 C++用stack实现深度优先搜索DFS的完整源码(定义,实现,main函数测试) C++用stack实现深度优先搜索DFS的完整源码(定义,实现,ma ...

  4. 深度优先搜索(DFS) 总结(算法+剪枝+优化总结)

    深度优先搜索(DFS) 总结(算法+剪枝+优化总结) 本文中会引用部分实例.文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举.如有侵权请联系我更换或删除!对于提供题解思路的各位大 ...

  5. 【算法很美】深入递归 (下)深度优先搜索DFS问题

    深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...

  6. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍 ...

  7. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  8. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

  9. 树的广度优先搜索(BFS),深度优先搜索(DFS)

    BFS:Breadth First Search,广度优先搜索 DFS:Depth First Search,深度优先搜索 如图,A节点的下一级元素为B节点和C节点,B节点的下一级元素为D节点和E节点 ...

  10. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

最新文章

  1. Spring servlet
  2. 也有个自由职业梦?日本码农辞职一年后:独立工程师太难了
  3. Sql Server 2005 中的row_number() 分页技术
  4. ActiveMQ学习笔记(21)----ActiveMQ集成Tomcat
  5. java视频流传输_目前在Web浏览器中流式传输实时视频的最佳做法?
  6. qt编写触摸事件的关键
  7. 算法每日学打卡:01-21打卡(解答后面整理)
  8. java电力巡检系统 项目讲解_公司召开安全巡检系统APP试点项目上线启动会
  9. java math tan,Java Math.tan() 方法
  10. DPDK ring库:环形缓冲区的解剖
  11. golang基础之三-字符串,时间,流程控制,函数
  12. CStatic控件的基本使用
  13. oracle to date mysql_mysql中怎么实现oracle中的to_char和to_date
  14. linux git ssh免密拉取 配置过程
  15. 《原神》游戏设计分析
  16. 【HUSTOJ】1055: 字符图形11-字母正三角
  17. http://msdn.itellyou.cn/
  18. python 一个简单的网站采集
  19. iptables场景一(上)
  20. 四元数船舶领域Quaternion ship domain

热门文章

  1. 计算机系统-电路设计10-寄存器的内部电路实现(输入与输出不同线)
  2. Spring-ConfigurationClass类
  3. 北大计算机基础与应用,北大16秋《计算机基础与应用-第六组》在线作业
  4. wince6.0远程控制工具_用微信远程控制你的电脑,这个工具又加了一些小功能(硬件+软件)...
  5. list 分组_Todo List(源码已上传git): 待办事项自定义分组 - 第三章
  6. 攻防世界reverse新手练习
  7. 技术胖Flutter第四季-19导航父子页面的跳转返回
  8. Python入门基础之条件判断、循环、dict和set
  9. myEclipse怎样将程序部署到tomcat(附录MyEclipse调试快捷键)
  10. 动态延迟加载网页元素jQuery插件scrollLoading