蓝桥杯(3):python搜索DFS

本文介绍了深度优先搜索(DFS)、回溯算法以及剪枝技巧在解决分糖果、买瓜、N皇后等问题中的应用,同时探讨了记忆化搜索在斐波那契数列等场景中的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 DFS简介

1.1 DFS与n重循环

1.2 代码实现

1.3 例题

1.3.1 分糖果

1.3.2 买瓜

2 回溯

2.1 定义

2.2 代码实例

2.1.1 排列数

 2.1.2 找子集

2.3 例题

2.3.1 N皇后

2.3.2 小朋友崇拜圈

2.3.3 全球变暖

3 剪枝

3.1 定义

3.2 分类

3.3 例子

3.3.1 数字王国之军训练队

3.3.2 特殊的多边形

4 记忆化搜索

4.1 定义

4.2 例子

4.2.1 斐波那契数列

4.2.2 混沌之地

4.2.3 地宫取宝


1 DFS简介

只要出现可以不选的就是没有循环!

1.1 DFS与n重循环

DFS 就是枚举 和n重循环

1.2 代码实现

#dfs和n重循环
x = int(input())
n = int(input())
path = [0]*n
#depth从0开始哦!!!

def dfs(depth):

    #depth表示当前的深度!
    #采用递归的思想
    #写递归出口
    if depth == n:

        for i in range(1,n):
            if path[i] >= path[i-1]:
                continue
            else:
                return
        if sum(path) != x:
            return
        
        print(path)
        return

    else:
        for i in range(1,x+1):
            path[depth] = i
            dfs(depth+1)


dfs(0)

1.3 例题

1.3.1 分糖果

#糖果总数
#一共有7个小朋友,9个第一种糖果,16个第二种糖果
ans = 0
def dfs(depth,n,m):
    #depth当前是第几个小朋友
    #n表示剩余几个第一种
    #m表示剩余几个第二种
    if depth == 7:
        if n==0 and m==0:
            global ans
            ans +=1
        # print(ans)
        return
    else:
        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)

1.3.2 买瓜

#买瓜

def dfs(depth,weight,cnt):
    #depth表示第depth个瓜
    #weight表示当前的重量
    #cnt表示砍了几刀
    if weight > m:
        return
    if weight == m:
        global ans
        ans = min(ans,cnt)
    if depth == n:
        return
    else:
        #买全部
        dfs(depth+1,weight+a[depth],cnt)
        #卖一半
        dfs(depth+1,weight+a[depth]//2,cnt+1)
        #没买
        dfs(depth+1,weight,cnt)


n,m = list(map(int,input().split()))
a = list(map(int,input().split()))
weight = 0
cnt = 0
m*=2
a = [i*2 for i in a]
ans = n+1
dfs(0,0,0)

if ans == n+1:
    ans = -1

print(ans)

2 回溯

区间长度固定?

2.1 定义

2.2 代码实例

2.1.1 排列数

回溯:判断是否能选、打标记、记录路径、下一层、回到上一层??(是怎么回去的啊老铁)清楚标记、清楚路径储存

回到上一层:通过debug我得出:回到上一层其实是递归自己过程中的实现

递归会造成多个函数的运行,只有运行完才会结束!语言描述能力有限,具体可以自己debug一下感受

n = int(input())
vis = [False]*(n+1)
path = []


def dfs(depth):
    if depth == n:
        print(path)
        return
    else:
        for i in range(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值