目录
DFS深度优先搜索
DFS和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): path[depth]=i dfs(depth+1) #所拆的数字 x=int(input()) #要拆成的个数 n=int(input()) #path[i]表示第i个数字 path=[0]*n dfs(0)
可以剪枝:
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): path[depth]=i dfs(depth+1) #所拆的数字 x=int(input()) #要拆成的个数 n=int(input()) #path[i]表示第i个数字 path=[0]*n dfs(0)
回溯
#回溯模板 def dfs(depth): if depth == n: print(path) return for i in range(1,n+1): if vis[i] == False: vis[i]=True path.append(i) dfs(depth+1) vis[i]=False path.pop() n =int(input()) path=[] vis=[False]*(n+1) dfs(0)
剪枝
记忆化搜索
import sys sys.setrecursionlimit(100000) dic={0:1,1:1} def f(n): if n in dic.keys(): return dic[n] dic[n]=(f(n-1)+f(n-2))%100000007 return dic[n] n=int(input()) print(f(n))
from functools import lru_cache @lru_cache(maxsize=None) def f(x): if x == 0 or x == 1: return 1 return f(x - 1) + f(x - 2) n = int(input()) print(f(n))