由SWUSTOJ 0032浅谈DFS深度优先搜索
2018-02-19 09:49
267 查看
今天笔者先用一道题来简单介绍DFS深度优先搜索。
先放题目
http://acm.swust.edu.cn/#/problems/32/-1?_k=hmwlqf
Tags: 搜索设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。 如果有满足条件的选择,则此背包有解,否则此背包问题无解。
那么这个暴力枚举+递归的思维过程是怎样的呢?看图
现在假设有3个物品要放进包里,那么从第一个物品开始,每个物品都有两种可能——放或者不放进包里,所以对最后就一共会出现2^3=8种情况,也就是说对于每种DFS树最后都会有2^n种情况出现。
现在思路说完了那就放代码
先放题目
http://acm.swust.edu.cn/#/problems/32/-1?_k=hmwlqf
Tags: 搜索设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。 如果有满足条件的选择,则此背包有解,否则此背包问题无解。
输入
输入数据有多行,包括放入的物品重量为s,物品的件数n,以及每件物品的重量(输入数据均为正整数)多组测试数据。输出
对于每个测试实例,若满足条件则输出“YES”,若不满足则输出“NO“样例输入
20 5 1 3 5 7 9
样例输出
YES这个时候我们就来思考一下,我们要用什么样的方法来解决这个问题,很多同学都反应过来要用到暴力枚举来解决。但是仅靠暴力枚举是不够的,因为对于不同的样例枚举出来的方案数量是不一定相等的,于是我们再引入一个递归的方法,这样对于每组样例就有一个可以自动实现的枚举。
那么这个暴力枚举+递归的思维过程是怎样的呢?看图
现在假设有3个物品要放进包里,那么从第一个物品开始,每个物品都有两种可能——放或者不放进包里,所以对最后就一共会出现2^3=8种情况,也就是说对于每种DFS树最后都会有2^n种情况出现。
现在思路说完了那就放代码
//这道题就是要暴力枚举出所有的情况,然后每种情况进行判断,只要有一种情况满足就输出yes #include<stdio.h> int n[50],sum,a,b,x,y=0;//定义y的初值为0,若最后y==0则表示没有达到目的 void dfs(int a,int b) { if(a==x) { if(b==sum)//这个是表示背包装好指定重量的物品 y=1;return ; //达到目的将1赋值给y } dfs(a+1,b+n[a]);//这是个递归的过程,这一步是表示加上(先画图示意) dfs(a+1,b);//同上,只是这个表示的是没有加上 } int main() { int i,j; while(~scanf("%d%d",&sum,&x))//sum是指需要多重的物品,x表示又多少件物品 { y=0; for(i=0;i<x;i++) { scanf("%d",&n[i]); } dfs(0,0); if(y==1)printf("YES\n"); else printf("NO\n"); } return 0; }所以所谓的深度优先搜索其实就是一个暴力枚举+递归思想的过程
相关文章推荐
- DFS 深度优先搜索
- nyoj 部分和问题(深度优先搜索DFS)
- (深度优先搜索第一课) 统计三角形 - DFS
- ACM-POJ 1562 DFS 深度优先搜索
- DFS--深度优先搜索--图的邻接表表示
- poj1088 滑雪 dp记忆化搜索 dfs深度优先搜索
- DFS深度优先搜索之走迷宫
- DFS深度优先搜索
- 深度优先搜索(DFS)
- leetcode 226. Invert Binary Tree 反转二叉树 + DFS深度优先搜索
- 搜索------深度优先DFS-----模板2:例1 例2 例3 例4
- nyoj 部分和问题(深度优先搜索DFS)
- DFS--深度优先搜索
- 深度优先搜索DFS——图邻接表表示
- DFS--深度优先搜索--图的邻接表表示
- poj3009之深度优先搜索 dfs解法
- leetcode 698. Partition to K Equal Sum Subsets K个相等子集 + 深度优先搜索DFS
- Oil Deposits(深度优先搜索DFS)
- nyoj 部分和问题(深度优先搜索DFS)
- 深度优先搜索DFS——图邻接矩阵表示