035 搜索之DFS基础

DFS:深度优先搜索——本质上是暴力枚举,尽可能一条路走到底,走不了回退

1.DFS与n重循环

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

分析:这种情况下就可以三重暴力循环破解

如果要拆分成n个正整数,就要实现n重循环

答题模板:不知道要进行多少次循环=n重循环=特定的树结构=DFS搜索

# 从用户处获取输入,x 表示生成序列中数字的和以及每个位置数字的取值上限(1 到 x)
# 最终生成的序列里所有数字相加要等于 x,且每个数字的取值范围是 1 到 x
x = int(input("请输入数字的和以及每个位置数字的取值上限 x: "))
# 从用户处获取输入n 表示要生成的序列深度
# 也就是最终生成的序列包含多少个数字
n = int(input("请输入要生成的序列的长度 n: "))

# 初始化用于存储当前生成序列的列表 path
# 先创建空列表,之后将其初始化为长度为 n 的列表,每个元素初始值为 0
# path 列表将在后续深度优先搜索过程中逐步填充数字,代表当前正在生成的序列
path = []
path = [0] * n

# 定义深度优先搜索函数 dfs,depth 表示当前正在处理序列的第几层
# last_value 表示上一层选择的数字,用于保证生成的序列是递增的
def dfs(depth, last_value):
    # 递归出口条件:当 depth 等于 n 时,说明已经生成了一个完整的长度为 n 的序列
    if depth == n:
        # 检查序列中所有数字的和是否等于输入的 x
        # 只有和为 x 的序列才是符合我们要求的序列
        if sum(path) != x:
            return
        # 如果序列中数字的和等于 x,则打印该序列
        print(path)
        return
    # 枚举当前位置(第 depth 个位置)可以取的值,范围是从 last_value 到 x
    # 从 last_value 开始枚举能保证生成的序列是递增的,避免生成重复或递减的序列
    for i in range(last_value, x + 1):
        # 下一层从上一层的起点+1开始
        # 比如说第一层选 3,第二层就要从 3 开始枚举,前面的 1 和 2 就不用考虑了,这样能保证是递增的
        # 将当前枚举的值 i 赋给序列的第 depth 个位置
        path[depth] = i
        # 递归调用 dfs 函数,处理下一个位置(depth + 1)
        # 同时将当前选择的数字 i 作为下一层的 last_value 传入,确保后续枚举是递增的
        dfs(depth + 1, i+1)

# 启动深度优先搜索,从序列的第一个位置(depth = 0)开始
# 初始时上一层没有选择数字,所以 last_value 设为 0
dfs(0, 0)

#请输入数字的和以及每个位置数字的取值上限 x: 7
# 请输入要生成的序列的长度 n: 3
# [0, 1, 6]
# [0, 2, 5]
# [0, 3, 4]
# [1, 2, 4]

提炼模板

def dfs(depth):
    #当前为第几重循环
    if depth==n: #如果是最后一重循环
        return
    #每重循环的枚举选择

     

#分析:七个小朋友,所以是七重循环,n=7
       # 每个小朋友得到的糖果2-5  2<=x<=5
ans=0
def dfs(depth,n,m):
    if depth==7:
        if n==0 and m==0:
            global ans
            ans=ans+1
        return
    #枚举当前小朋友的糖果可能性
    #枚举第一种糖果
    for i in range(0,6):
        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)
# 5067671



# 分析:n重循环,每重循环三种情况:买一个,买半个,不买
def dfs(depth,weight,count):
    if weight>m:  #当前已经不合法,没必要继续下去
        return
    if weight==m:
        global ans
        ans=min(ans,count)
    #depth:第depth个瓜
    #weight:表示当前买到的瓜的重量
    #count:表示劈了多少次
    if depth==n:
        return
    #枚举瓜的三种情况
    #不买
    dfs(depth+1,weight+0,count)
    #买
    dfs(depth+1,weight+a[depth],count)
    #买一半
    dfs(depth+1,weight+a[depth]//2,count+1)

n,m=map(int,input().split())  #n表示n个瓜,m表示要买的重量
m=m*2  #为了比避免出现小数影响精度,所以都乘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=-1
print(ans)


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【系统迁移】将系统迁移到新硬盘中(G15 5520)

文章目录 前言问题描述解决步骤&#xff08;红色为 debug 步骤&#xff09;参考文献 前言 参数&#xff1a; 电脑 dell g15 5520硬盘&#xff1a;1T 自带硬盘 海力士 2230 -> 2T 西数蓝盘 2280 问题描述 电脑硬盘过小&#xff08;且只有一个接口&#xff09;&#xff0c;将…

大模型综合性能考题汇总

- K1.5长思考版本 一、创意写作能力 题目1&#xff1a;老爸笑话 要求&#xff1a;写五个原创的老爸笑话。 考察点&#xff1a;考察模型的幽默感和创意能力&#xff0c;以及对“原创”要求的理解和执行能力。 题目2&#xff1a;创意故事 要求&#xff1a;写一篇关于亚伯拉罕…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

Pluto固件编译笔记

前段时间我已经做到在电脑上交叉编译一个简单的c/c程序&#xff0c;然后复制到pluto上运行。 要做到这一点&#xff0c;其实参考adi pluto官网的wiki就能做到了。 但这样有几个问题&#xff0c;只能做到简易程序&#xff0c;如果程序复杂&#xff0c;要调用更多库而SYSROOT里…

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

星际智慧农业系统(SAS),智慧农业的未来篇章

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 相关文章&#xff1a;星际战争模拟系统&#xff1a;新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 “新月智能武器系统”CIWS&#xff0c;开启智能武器的新纪元-CSDN博客 目录 星际智慧农业…

【蓝桥杯嵌入式入门与进阶】4.初读启动文件:粗略阅读,经常翻阅,知己知彼,百战百胜

目录 1.二者差异 1. 1适用芯片型号不同 1.2中断向量表差异 1.2.1 中断数量和种类 1.2.2 部分中断处理函数命名差异 1.2.3. 复位处理描述差异 1.2.4代码注释中的功能描述差异 1.2.5 DMA 通道中断处理函数差异 示例代码对比片段 startup_stm32g431xx.s startup_stm32…

unity中的动画混合树

为什么需要动画混合树&#xff0c;动画混合树有什么作用&#xff1f; 在Unity中&#xff0c;动画混合树&#xff08;Animation Blend Tree&#xff09;是一种用于管理和混合多个动画状态的工具&#xff0c;包括1D和2D两种类型&#xff0c;以下是其作用及使用必要性的介绍&…

C语言 --- 分支

C语言 --- 分支 语句分支语句含义if...else语句单分支if语句语法形式 双分支 if-else 语句语法形式 悬空else含义问题描述 多分支 if-else 语句语法形式 switch...case语句含义语法形式 总结 &#x1f4bb;作者简介&#xff1a;曾与你一样迷茫&#xff0c;现以经验助你入门 C 语…

pytorch实现长短期记忆网络 (LSTM)

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 LSTM 通过 记忆单元&#xff08;cell&#xff09; 和 三个门控机制&#xff08;遗忘门、输入门、输出门&#xff09;来控制信息流&#xff1a; 记忆单元&#xff08;Cell State&#xff09; 负责存储长期信息&…

C++:抽象类习题

题目内容&#xff1a; 求正方体、球、圆柱的表面积&#xff0c;抽象出一个公共的基类Container为抽象类&#xff0c;在其中定义一个公共的数据成员radius(此数据可以作为正方形的边长、球的半径、圆柱体底面圆半径)&#xff0c;以及求表面积的纯虚函数area()。由此抽象类派生出…

GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI

同学们好&#xff01;今天和大家分享的是 “改进型土壤调整植被指数MSAVI”&#xff0c;它能够更准确地反映植被生长状态&#xff0c;且广泛应用于植被覆盖监测、生态环境评估等领域。 1. MSAVI 改进型土壤调整植被指数&#xff08;MSAVI&#xff09;是一种针对植被覆盖区域土…

deepseek+vscode自动化测试脚本生成

近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…

CodeGPT使用本地部署DeepSeek Coder

目前NV和github都托管了DeepSeek&#xff0c;生成Key后可以很方便的用CodeGPT接入。CodeGPT有三种方式使用AI&#xff0c;分别时Agents&#xff0c;Local LLMs&#xff08;本地部署AI大模型&#xff09;&#xff0c;LLMs Cloud Model&#xff08;云端大模型&#xff0c;从你自己…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束

使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下&#xff0c; CLOCK_DEDICATED_ROUTE 约束设置为 TRUE &#xff0c;并且缓存 /MMCM 或 PLL 对必须布局在相同…

Ollama 介绍,搭建本地 AI 大模型 deepseek,并使用 Web 界面调用

Ollama 是一个基于 Go 语言的本地大语言模型运行框架&#xff0c;类 Docker产品&#xff08;支持 list,pull,push,run 等命令&#xff09;&#xff0c;事实上它保留了 Docker 的操作习惯&#xff0c;支持上传大语言模型仓库(有 deepseek、llama 2&#xff0c;mistral&#xff0…

OpenEuler学习笔记(十四):在OpenEuler上搭建.NET运行环境

一、在OpenEuler上搭建.NET运行环境 基于包管理器安装 添加Microsoft软件源&#xff1a;运行命令sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm&#xff0c;将Microsoft软件源添加到系统中&#xff0c;以便后续能够从该源安装.…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网&#xff08;IoT&#xff09;‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术&#xff0c;实时采集并连接任何需要监控、连接、互动的物体或过程&#xff0c;实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…