035 搜索之DFS基础

news/2025/2/3 14:11:11 标签: 深度优先, 算法

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)



http://www.niftyadmin.cn/n/5840860.html

相关文章

如何实现滑动列表功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了沉浸式状态栏相关的内容&#xff0c;本章回中将介绍SliverList组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的SliverList组件是一种列表类组件&#xff0c;类似我们之前介…

使用Visual Studio打包Python项目

1. 安装Visual Studio 首先&#xff0c;你需要在你的计算机上安装Visual Studio。 2. 创建项目 在Visual Studio中创建一个新的Python项目。 打开Visual Studio&#xff0c;点击“File”&#xff08;文件&#xff09; -> “New”&#xff08;新建&#xff09; -> “Pr…

《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——以Odoo为数据中台低成本实现售前售中一体化

某机电设备有限公司数字化转型案例&#xff1a;以Odoo为数据中台实现售前售中一体化 一、企业背景某机电设备有限公司在机电设备领域历经多年发展&#xff0c;业务广泛&#xff0c;涵盖工业自动化设备、电力设备等产品的销售与服务。随着业务版图不断拓展&#xff0c;企业面临…

稀疏进化训练:机器学习优化算法中的高效解决方案

稀疏进化训练&#xff1a;机器学习优化算法中的高效解决方案 稀疏进化训练&#xff1a;机器学习优化算法中的高效解决方案引言第一部分&#xff1a;背景与动机1.1 传统优化算法的局限性1.2 进化策略的优势1.3 稀疏性的重要性 第二部分&#xff1a;稀疏进化训练的核心思想2.1 稀…

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

Redis 是一个高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。在面试中&#xff0c;Redis 是一个高频话题&#xff0c;尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f; 答案&a…

在Qt中,slots 关键字有什么用?

有下面的Qt代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…

deepseek本地部署会遇到哪些坑

在本地部署DeepSeek(或其他类似AI模型)时,可能会遇到以下常见问题及解决方案: 1. 硬件资源不足 问题表现: GPU不兼容(如型号过旧)、显存不足(OOM错误)或CPU模式性能极低。解决方案: 确认GPU支持CUDA,检查显存需求(如至少16GB显存)。使用nvidia-smi监控显存,通过降…