最近新学习了一种新的求解的方法,就是暴力搜索,在通常做题没有很明确的思路的时候,通常都会采用的一种方式。

我们知道,一个问题的解空间通常对应的是一棵树的方式进行组织的,那么我们可以通过根据题目中的条件描述来扫描

树中的每一个结点,对应的就是将问题的所有可能的解进行扫描一遍,从中选出满足要求的即为问题的答案了。

这也就是人们常说的搜索,搜索的对象是解空间树。 当然,根据不同的情况而言,树中的结点个数可能会有很多,

很多情况下,在规定的时间之内是不能够搜索到全部的解所对应的顶点的,所以这也就随之产生了很多中搜索的方法:

1.暴力搜索法: 暴力搜索就是以枚举的方法一一例举解空间树上的每一个结点,直至找到满足要求的节点

主要有两种类型题: 1. N个位置上的数据选取x 个,x 为任意数字,对应的N 个数据每个数据,两种状态  0  , 1 ,0代表没有被选取, 1 代表的是选取

这样的话, N 个数据,对应的可能有  2^N 中可能性,当然解空间树全部遍历,对应 2^N 个顶点,当然对应的时间复杂度为 O(2^n)

2. N个位置上的数据全部选取,但是选取的顺序不同造成的结果不同------>对应的是对 N 进行全排列的方式,

这种实现方式有两种,一种是暴力搜索对应的时间复杂度为 O(N^N). 另一种是 O(N!) ,基于的是 dfs 搜索的方式。

2.二分搜索法 :通过每次将所访问的解空间树中的结点个数减半,即如果当前正在访问的是解空间树中的 i 顶点,

根据题目中所描述的信息,选取 i 顶点的左子树或是右子树,然后丢弃没有选择的子树。对选取的子树进行同样的操作。

不过这种搜索方法要求的是,所搜索的关键字是需要有序排列的,这样每次在进行二分的时候,

才能够保证所访问的树的顶点 i 的左右子树的数量都是相同的,并且(左子树结点值)< i < (右子树结点值) ,或是另一种序列。

3. DFS 搜索: 沿着一个起始访问点,一直走直到访问到底为止,深度优先搜索。

通常实现起来可以通过递归的方式来对其进行实现。 也可以使用模拟栈的方式来实现。

4. BFS搜索: 逐层遍历搜索树中的每一个结点,BFS通常是用来选取最优解的方式,因为逐层遍历的方式,如果发现满足题意的解的话,

该解必定位于的是所有的可能解中的距离根节点最近的一个结点,所以是最优解。

通常实现的方式是基于 队列 作为辅助数据结构来实现。

-------------------------------------------------------------------------------------------------------------------------------------------------------

1.暴力搜索法编程小练习:

1.1 已知,一个背包能够存放最大物体的重量为 C , 现在有 N 个物体,对应的重量是 w[ 0 ... N-1], 请你求出,将物体中选取出一些 (x 个, x <= n ),

使得这 x 个物体的总共重量不超过背包能够承受的最大的重量C, 求出这个最大的重量。

输入数据格式

N C

w[0] ....w[N-1]

输出数据的格式

放入包中的物品最大重量值

</pre><pre name="code" class="cpp">#include <cstdio>
#include <string.h>
#include <algorithm>int ans = 0 ;
int N , C , w[1005] ;void input( )
{memset( w , 0 , sizeof ( w ) ) ;scanf("%d%d", &N , &C ) ;for ( int i = 0 ; i < N ; i++ ){scanf("%d", &w[i]) ;}
}void dfs ( int step , int  nowW )
{if ( step == N ){if ( nowW <= C ){ans = ans>nowW?ans:nowW ;}return ;}dfs( step+1 , nowW) ;dfs( step+1 , nowW+w[step] ) ;}int main ( void )
{input() ;dfs( 0 , 0 ) ;if ( ans > 0  )printf("ans = %d\n", ans ) ;else printf("No") ;return 0 ;
}

1.2 已知,一个背包能够存放最重的重量为 C , 现在有 N 个物体,N 个物体所对应的重量为 w[ 0.. N-1] , 请你求出,在不对每个物品进行分割

并且不超过背包限定总重量的情况下,能够存放的最多物品的个数是多少,此时背包的重量是多少,存放物品的编号是多少( 0...N-1)

输入数据格式

N C

w[0] w[1] ... w[ N-1 ]

输出数据的格式

最多的物品个数

背包重量

所存放的物品编重量 ( 0 .. N-1 )

#include <cstdio>
#include <algorithm>using namespace std ;int N , C ;
int w[1001] ;void input( )
{scanf("%d%d", &N , &C) ;for ( int i = 0 ; i < N ; i++ ){scanf("%d", &w[i]) ;}
}int cnt = 0 ;
int sum = 0 ;void  fun()
{sort ( w , w+N ) ;for ( int  i = 0 ; i < N ; i++ ){if ( sum + w[i] <= C ){sum += w[i] ;cnt++;}elsebreak;}
}int main ( void )
{input() ;fun() ;if ( cnt != 0 ){printf("%d\n", cnt ) ;printf("%d\n", sum) ;for ( int i = 0 ; i < cnt ; i++ )printf("%d  ", w[i]) ;}elseprintf("No") ;return 0 ;
}

1.3 一直一个数组 a[ 0..n-1] 中有 n 个数值,现在给你一个固定的数值 K, 试问,在数组 a 中是否存在一组数值使得这些数值的和刚好等于 K

如果存在的话,输出 Yes。 如果不存在的话,则输出 No

输入格式

n K

a[0] a[1] ... a[n-1]

输出格式

Yes

No

#include <cstdio>
#include <string.h>
#include <iostream>using namespace std ;int a[101] ,n , k ;
bool ok = false ;void input ()
{scanf("%d%d", &n , &k ) ;for ( int i = 0 ; i < n ; i++ )cin>>a[i] ;
}
void dfs ( int step , int v )
{if ( step == n ){if ( v == k ) ok = true ;return ;}dfs(  step+1, v+a[step] ) ;dfs(step+1 , v ) ;
}int main ( void )
{input() ;dfs ( 0 , 0 ) ;if ( ok ){printf("Yes") ;}elseprintf("No") ;return 0 ;
}

在这里突然发现一个问题,dfs 应该在不对其进行剪枝操作的前提下是暴力搜索的一种特例。

//1.4 给定一个数值N, 打印出 N 到 1 的全部全排列

暴力搜索---新技能get相关推荐

  1. AI时代,产品经理需要掌握的5项新技能

    不同于传统的产品经理,AI时代的产品经理更加注重的如何将技术应用在业务问题上.AI时代,产品经理最重要的职责就是提供数据规范,所以这也要求产品经理对数据有足够的认识.文章对AI时代产品经理需要掌握的新 ...

  2. 算法模版:暴力搜索之DFS【沈七】

    本文已收录于专栏 ⭐️ <算法通关笔记>⭐️ 算法模版:暴力搜索之DFS 前言 基本概念 算法思想 常用模板 三种枚举方式 指数型枚举 排列型枚举 组合型枚举 完结散花 题目练习 参考文章 ...

  3. OSChina 周二乱弹 ——女王节 教你撩妹新技能

    2019独角兽企业重金招聘Python工程师标准>>> 女王节 无论你的她,是女汉子,还是女神(经) 3.8这天,她都是女王 这天女王们地位无比高尚! 要伺候好你们的女王大人哦! 能 ...

  4. 一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

    一文解锁华为云新技能-AIOT开发全流程[设备接入-ESP端侧数据收集[MQTT]-实时数据分析](步步截图较详细) 在这篇你将会接触到:从物联网工程师从硬件层-通信层到应用层全流程:开发华为云最基本 ...

  5. 年轻就该多尝试,教你20小时Get一项新技能

    LZ作为一个很喜欢体验的人来说,总想什么都尝试一下(这个世界这么慷慨,不多体验下多亏!),体验了这么多东西,发现,其实很多东西入门其实都不难的.我总是劝我身边的人多去体验一下新鲜事物,也一直想写这篇文 ...

  6. 查看文章影响因子的插件_新技能:如何在NCBI按照影响因子查找文章

    作为一只科研狗,在NCBI上搜索文章是最基本的生存技能.NCBI上的PubMed 是一个免费的搜索引擎,提供生物医学方面的论文搜索以及摘要,目前收录有至少2600万文章.其网址如下:https://w ...

  7. 10分钟 GET 新技能 - XPath

    10分钟 GET 新技能 - XPath 1. XPath 是什么? 2. XPath 的基本规则 3. Python 流行库 lxml 中使用 XPath 10分钟 GET 新技能 - XPath ...

  8. 学习新技能时,大脑在如何发生改变?

    来源:中国生物技术网 众所周知,无论是一项运动.一种乐器还是一门手艺,掌握一项新技能都是需要花费时间并进行训练的.虽然我们都知道健康的大脑能够应付的来,但是为了开发出新行为大脑如何发生改变科学家们对此 ...

  9. 开课吧python学费-分享一个小白也能月赚2万的新技能

    原标题:分享一个小白也能月赚2万的新技能 这两年,每天都听身边人吐槽:"最近太累了,加班多.事情杂.离家远......可到手的工资却少得可怜." 辞职.跳槽,已然成为一种常态. 这 ...

最新文章

  1. mysql5.7.20安装红黑_Window环境安装MySQLServer5.7.21
  2. 大佬带你详解Python反爬虫措施以及爬虫编写注意事项
  3. 近朱者赤,近墨者还是赤
  4. Xamarin.Forms教程下载安装Windows版的Xamarin开发工具
  5. Java面试题整理,连续四年百度Java岗必问面试题
  6. 034:DTL常用过滤器(3)
  7. docker 运行 php nginx_docker搭建nginx+mysql+php
  8. 01、python数据分析与机器学习实战——python数据分析处理库-Pandas
  9. IOS-网络(文件上传)
  10. 10 WM配置-主数据-定义仓位类型(Bin Type)
  11. Node对CommonJS模块的实现
  12. 网站发布在中文操作系统,但ReportViewer的工具栏显示为英文的解决方法
  13. 不要为了“分库分表”而“分库分表”!
  14. 揭密 Vue 的双向绑定
  15. 【路径规划】基于matlab蚁群算法求解公交车路径规划问题【含Matlab源码 930期】
  16. 2022-07-08 Unity Json2——LitJson
  17. 【小程序】自定义组件设置样式失效使用外部样式类解决
  18. linux将文件前面100行导出,linux中,使用cat、head、tail命令显示文件指定行
  19. 详解旨在提升EVM底层性能的兼容公链Monad
  20. AAC音频压缩(转载)

热门文章

  1. 我的钱包页面HTML,我的钱包.html
  2. Latex——数学符号大全
  3. SSM框架实现用户查询、注册、登录——IDEA整合Spring、Spring MVC、Mybatis 框架
  4. U盘文件突然不见却占内存 解决方案
  5. 电信业Hadoop应用分析
  6. spyder pyecharts不显示_后期剪辑还在升级主机配置?换台京东方显示器才最重要...
  7. ACTF2020 writeup
  8. 肿瘤免疫疗法 | 细胞治疗和PD1/PDL1 | Tumor immunotherapy | cell therapy
  9. 数学建模复习——代码记录
  10. 【转】如何评价 Apple 新推出的编程语言 Swift?