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,这篇就先写到这里,下次继续!

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


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/463337.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化之维恩图 Venn diagram

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图或韦恩图&#xff0c;是一种关系型图表&#xff0c;用于显示元素集合之间的重叠区…

SpringBoot框架入门指南

文章目录 SpringBoot的特点Spring&#xff0c;SpringBoot的区别SpringBoot常用注解标签SpringBoot概述SpringBoot简单Demo搭建读取配置文件的内容 SpringBoot自动配置Condition自定义beanSpringBoot常用注解原理EnableAutoConfiguration SpringBoot监听机制SpringBoot启动流程分…

Netty中的常用组件(三)

ChannelPipeline 基于Netty的网路应用程序中根据业务需求会使用Netty已经提供的Channelhandler 或者自行开发ChannelHandler&#xff0c;这些ChannelHandler都放在ChannelPipeline中统一 管理&#xff0c;事件就会在ChannelPipeline中流动&#xff0c;并被其中一个或者多个Chan…

Android 移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&#xff0c;部分库下载异…

Godot VisualStudio外部编辑器设置

文章目录 前言Godot visual studio 调试附加程序监听解决中文报错问题通过调试属性直接启动添加场景运行结果 Godot专栏地址 前言 Godot本质上只是一个游戏引擎&#xff0c;对C#只做了最小的适配&#xff0c;就是能打开&#xff0c;但是不能Debug。Godot支持许多外部编辑器&am…

力扣经典题:对称二叉树

思路&#xff1a;写出另一个函数&#xff0c;比较两个节点&#xff0c;根的左右节点单独考虑&#xff0c;作为主体函数写出&#xff0c;然后在递归返回左指针的左边与右指针的右边&#xff0c;以及左指针的右边和右指针的左边&#xff0c;注意考虑空指针情况 bool good(struct …

汽车零部件MES系统实施方案

中国汽车业在不断完善提升汽车制造自动化技术的同时&#xff0c;瞄准汽车零部件系统化开发、模块化制造、集成化供货模式&#xff0c;通过汽车零部件MES系统的快速应用&#xff0c;借助全新的设计和工艺流程&#xff0c;对产线关键工位的交互进行严格控制&#xff0c;改变以往由…

treeData 树结构数据处理(react)

1.什么是tree 树(tree)形结构是一种重要的非线性结构&#xff0c;依据分支关系定义的层次结构&#xff0c;在这种结构中&#xff0c;每个元素至多只有一个前趋&#xff0c;但可以有多个后继。 树的定义&#xff1a;树(Tree)是n(n 大于等于0)个节点的有限集合T&#xff0c;当n0…

Mysql Day03

多表设计 一对多 在多的一方添加外键约束&#xff0c;关联另外一方主键 一对一 任意一方添加外键约束&#xff0c;关联另外一方主键 多对多 建立第三张中间表&#xff0c;中间表至少包含两个外键&#xff0c;分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff08;木马、病毒、恶意脚本、webshell等&#xff09;&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方&#xff0c;由于程序对用户上传…

uv机器电机方向极性

爱普生主板设置X、Y 电机方向极性&#xff1a;请根据实际情况设置&#xff0c;开机初始化时如果电机运动方向反了则修改此极性。 理光主板设置X、Y 电机方向极性

english_syntax

文章目录 什么是英语的句子&#xff1f;英语句子的结构句子的成分&#xff08;词性问题&#xff09;谓语系动词主语宾语表语 并列句从句引导词名词性从句形容词性从句&#xff08;定语从句&#xff09;副词性从句&#xff08;状语从句&#xff09; 特殊结构强调句型倒装句型虚拟…