3.1蓝桥杯——dfs

一、DFS基础

1、 1、

x=int(input())
n=int(input())
#path[i]表示第i层拆出的数据
path=[0]*n
def dfs(depth):
    #depth:表示当前处于第depth层
    #递归出口
    if depth==n:
        for i in range(1,n):
            #判断数字是否递增
            if path[i]>=path[i-1]:
                continue
            else:
                return
        #判断数字之和是否为x
        if sum(path)!=x:
            return
        #答案
        print(path)
        return
    #对于每一层,枚举当前拆出的数据
    for i in range(1,x+1):#1-x
        path[depth]=i
        dfs(depth+1)
dfs(0)

 1、1剪枝

x=int(input())
n=int(input())
# path[i]表示第i层拆出的数据
path=[0]*n
def dfs(depth,last_val):
    if depth==n:
        if sum(path)!=x:
            return
        print(path)
        return
    for i in range(last_val,x+1):
        path[depth]=i
        dfs(depth+1,i)
dfs(0,1)

二、DFS回溯

1、排列

def dfs(depth):
    if depth==n:
        print(path)
        return
    for i in range(1,n+1):
        if vis[i]:
            continue
            #打标记,第depth个数字选择i
        vis[i]=True
        path.append(i)
        dfs(depth+1)
        #清空标记
        vis[i]=False
        path.pop(-1)#path.pop(-1)
n=int(input())
path=[]
vis=[False]*(n+1)#[False]*(n+1)
dfs(0)

2、子集

# 2、组合,给定n个数字,求子集
n = int(input())
a=list(map(int,input().split()))
path = []
def dfs(depth):
    if depth==n:
        print(path)
        return
    #选
    path.append(a[depth])
    dfs(depth+1)
    path.pop(-1)
    #不选
    dfs(depth+1)
dfs(0)

三、记忆化搜索

#原始
def f(n):
    if n==0 or n==1:
        return 1
    return f(n-1)+f(n-2)
#方法一记忆化,用字典
dic={0:1,1:1}
def f(n):
    if n in dic.keys():
        return dic[n]
    dic[n]= f(n-1)+f(n-2)
    return dic[n]
n=int(input())
print(f(n))
#记忆化,缓存的头文件,递归函数前加,普通函数变成记忆化
from functools import lru_cache
@lru_cache(maxsize=None)
def f(n):
    if n==0 or n==1:
        return 1
    return f(n-1)+f(n-2)
n=int(input())
print(f(n))

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值