目录
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(