一、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))