python 基础知识点(蓝桥杯python科目个人复习计划36)

2024-02-11 08:12

本文主要是介绍python 基础知识点(蓝桥杯python科目个人复习计划36),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今日复习计划:DFS搜索基础

1.简介

搜索方法:穷举问题解空间部分(所有情况),从而求出问题的解。

深度优先搜索:本质上是暴力枚举

深度优先:尽可能一条路走到底,走不了再回退。

2.DFS和n重循环

给定一个数字x,将其拆分成3个正整数,后一个要求大于等于前一个,给出方案。

最简单的思想:三重循环暴力求解。

若是拆分成n个正整数,就需要实现n重循环

n重循环 = 特定的树状结构 = DFS搜索

举个例子:

给定一个数字6,将其 拆分成3个正整数,后一个要求大于等于前一个,给出方案。

将其拆分成3个正整数,当然需要3重循环

第一层:0 

第二层:1 2 3 4 5 6

第三层:6组1 2 3 4 5 6,分别连接第二层的每个数字

这就是我们上数学时经常画的树状结构图。

n重循环,同样的道理

给定一个数字x,将其 拆分成n个正整数,后一个要求大于等于前一个,给出方案。

需要n重循环,也就是需要n层树状结构

用DFS:从上往下找一条合法的路径,所谓合法,就是要满足路径值不递减,长度为n,和为x三个条件。

我来把它转化成代码:

def dfs(depth):# depth:表示当前处于第depth层# 递归出口if depth == n:# 判断数字是否递增for i in range(1,n):if path[i] >= path[i - 1]:continueelse:returnif sum(path) != x:return# 这才是我们要的答案print(path)return# 对于每一层,枚举当前拆出的数字for i in range(1,x + 1):path[depth] = i # 当前层拆出了一个i,记录上去dfs(depth + 1)x = int(input())  # 题目给的数字
n = int(input())  # 需要拆分成n重循环
# path = [i]  # 表示第i个数字,给path一个初始值
path = [0] * n
dfs(0)

运行结果:

 

当然了,可以优化:

def dfs(depth,last_value):# depth:表示当前处于第depth层# 递归出口if depth == n:if sum(path) != x:return# 这才是我们要的答案print(path)return# 对于每一层,枚举当前拆出的数字for i in range(last_value,x + 1):path[depth] = i # 当前层拆出了一个i,记录上去dfs(depth + 1,i)x = int(input('输入题中的数字:'))  # 题目给的数字
n = int(input('请输入题目要求要拆分成几重循环:'))  # 需要拆分成n重循环
# path = [i]  # 表示第i个数字,给path一个初始值
path = [0] * n
dfs(0,0)

运行结果:

 

 这里的区别是:(我举个例子)

给定一个数字6,将其 拆分成3个正整数,后一个要求大于等于前一个,给出方案。

将其拆分成3个正整数,当然需要3重循环

第一重:0

第二重:1 2 3 4 5 6

第三重:1 2 3 4 5 6(对应数字1) 2 3 4 5 6(对应数字2)3 4 5 6(对应数字3)

               4 5 6(对应数字4)5 6(对应数字5)6(对应6)

就是把不必要的分支去掉了,类似于《运筹学》中“分支定界法”的“减支”这一步骤

例题1:分糖果

题目描述:

两种糖果分别于9个和16个,,要全部分给7个小朋友,每个小朋友得到的糖果总数最少为2个最多为5个,问有多少种不同的分法,且糖果必须全部分完。

只要有其中一个小朋友在两种方案中分到的糖果不完全相同,这两种方案就算两种不同的方案。

答案提交:

这是一道结果填空的题,你只需要算出结果都提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路:

用7重循环,每重循环代表一个小朋友,每个小朋友枚举自己的糖果情况。

参考答案:

ans = 0
def dfs(depth,n,m):# depth:第depth个小朋友# n:第一种糖果的剩余量# m:第二种糖果的剩余量# 递归出口if depth == 7:if n == 0 and m == 0:global ansans += 1return# 接下来枚举每个小朋友的情况# 第一种糖果的情况for i in range(0,6):# 因为每个人最多5个糖果# 第二种糖果的情况for j in range(0,6):# 接下来是题目所给的条件if 2 <= i + j <= 5 and i <= n and j <= m:dfs(depth + 1,n - i,m - j)dfs(0,9,16)  # 这是题目给的初始值
print(ans)

运行结果:

 

例题2:买瓜

题目描述:

小蓝正在一个瓜摊上买瓜,瓜摊上共有n个瓜,每个瓜的质量为Ai。

小蓝刀工了得,他可以把任何瓜劈成等重的两份,不过每个瓜只能劈一刀,小蓝希望买到的瓜的重量的和恰为m。

请问小蓝至少要劈多少个瓜才能买到质量恰好为m的瓜。

如果怎样小蓝都无法得到总重恰好为m的瓜,请输出-1。

输入描述:

输入的第一行包含两个整数n,m,用一个空格分开,分别表示瓜的个数和小蓝想买到的瓜的总重量。

第二行包括n个整数Ai,相邻整数之间用空格分隔,分别表示每个瓜的重量。

输出描述:

输出一个整数,表示答案。

思路:

n重循环,每重循环3种情况:买一个,买一半,不买。

参考答案:

def dfs(depth,weight,cnt):if weight > m:returnif weight == m:global ansans = min(ans, cnt)if depth == n:return# 枚举当前3种情况dfs(depth + 1,weight + 0,cnt)dfs(depth + 1,weight + A[depth],cnt)dfs(depth + 1,weight + A[depth] // 2,cnt + 1)n,m = map(int,input().split())
m *= 2
A = list(map(int,input().split()))
A = [x * 2 for x in A]
ans = n + 1
dfs(0,0,0)
if ans == n + 1:ans = -1print(ans)

运行结果:

 

OK,这篇就先写到这里,下次继续!

(若有不懂的地方,可以互相交流) 


 

这篇关于python 基础知识点(蓝桥杯python科目个人复习计划36)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699310

相关文章

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财