DFS算法及应用(一)

简介: DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。

DFS简介


搜索算法:穷举问题解空间所有情况


深度优先搜索:既暴力枚举,尽可能一条路走到底,走不了再回退


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


  • 就需要实现n重循环
  • n重循环=特定的树状结构=DFS搜索


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



DFS模板


def dfs(depth):
    
    if depth == n:
        # 递归的出口
        return
 
    # 每次循环做的枚举操作


例题:


分糖果


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


ans = 0  # 方案数
 
 
def dfs(depth, n, m):     # 每一层都有枚举
    # depth 第几个小朋友
    # n,m为剩余量
    if depth == 7:   # 不管还剩多少,dfs都结束了,如果剩余为零则说明ans加一
        if n == 0 and m == 0:
            global ans
            ans += 1
        return
    for i in range(0, 6):
        for j in range(0, 6):   # i+j是第一个小朋友的全部糖
            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


在写dfs函数时,要先写出递归的结束深度,以及在此处的判断,然后写出分糖果的一一枚举情况,最后写出下一层(下一个小朋友)的情况。


买瓜


小蓝正在一个瓜摊上买瓜。瓜摊上共有n个瓜,每个瓜的重量为A;小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。小蓝希望买到的瓜的重量的和恰好为m。请问小蓝至少要劈多少个瓜才能买到重量恰好为m的瓜。如果无论怎样小蓝都无法得到总重恰好为m 的瓜,请输出—1。


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


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



def dfs(depth, weight, cnt):   # 写之前要明确参数,这是第几个瓜,目前买到的质量是多少,目前劈瓜几次
    # 第depth个瓜
    # 当前买到瓜的重量
    # 劈了多少次
 
    # 剪枝
    if weight > m:    # 剪枝的出口
        return
    if weight == m:
        global ans
        ans = min(ans, cnt)
    if depth == n:   # 正常的出口
        return
 
    # 不买
    dfs(depth + 1, weight, cnt)
    # 买
    dfs(depth + 1, weight + A[depth], cnt)
    # 卖一半
    dfs(depth + 1, weight + A[depth] // 2, cnt + 1)
 
 
n, m = map(int, input().split())   # 买n个瓜,希望买到的总质量为m
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 = -1
print(ans)
 


  • 为了避免除以二造成的精确度缺失,我们对小蓝所期望的总质量m和每个瓜的质量A乘以二,可以默认劈瓜的次数为n+1,如果递归搜索完成还没有得到m,就让ans等于-1。


  • 同理depth,weight,cnt分别代表了轮到了第几个瓜,当前搜索到的总质量,劈瓜的次数。


  • 我们先写出函数的结束,既depth == n ,然后到了枚举阶段,上个案例是每次分给小朋友的糖果数,这次是根据劈不劈瓜分成三种情况。最后还有剪枝的回退,写入前段部分。


3 10

1 3 13

2



DFS算法及应用(二)+https://developer.aliyun.com/article/1544415?spm=a2c6h.13148508.setting.18.1fa24f0eaie4S4

相关文章
|
21天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
20天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
29天前
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
42 4
|
27天前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
|
29天前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
76 3
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
40 0
|
21天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
|
29天前
|
算法 vr&ar 计算机视觉
数据结构之洪水填充算法(DFS)
洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
41 0
|
2月前
|
监控 算法 数据挖掘
HyperLogLog算法有哪些应用场景呢
【10月更文挑战第19天】HyperLogLog算法有哪些应用场景呢
21 0