回溯法求子集树python
1、什么子集树
针对1/0背包问题,一个物品可以取或者不取,则所选取的物品构成一个子集树
例如:3个物品,001代表装入第三个物品,111代表三个物品全部装入等。
方法:
1、深度优先搜索
2、递归
def Backtrack(t):
if t >= l:
print(A)
else:
for i in range(0,2):
A[t] = i
Backtrack(t+1)
# 子集树s
if __name__ == '__main__':
row = input().split(',')
A = [int(i) for i in row]
l = len(A)
print('输入:', str(A))
Backtrack(0)
测试输入: 0, 0, 0, 0
预期输出: [0, 0, 0, 0] [0, 0, 0, 1] [0, 0, 1, 0] [0, 0, 1, 1] [0, 1, 0, 0] [0, 1, 0, 1] [0, 1, 1, 0] [0, 1, 1, 1] [1, 0, 0, 0] [1, 0, 0, 1] [1, 0, 1, 0] [1, 0, 1, 1] [1, 1, 0, 0] [1, 1, 0, 1] [1, 1, 1, 0] [1, 1, 1, 1]
2、什么排列树
针对旅行商问题,除去原点外,其他n-1个节点可以通过生成全排列方式来取得最优解,所有的排列方式构成一棵排列树
方法:
1、深度优先搜索
2、递归
def swap(a , b):
return b,a
def Backtrack(t):
if t >= l:
print(A)
else:
for i in range(t,l):
A[i],A[t] = swap(A[i],A[t])
Backtrack(t+1)
A[i],A[t] = swap(A[i], A[t])
if __name__=='__main__':
#排列树
row=input().split(',')
A=[int(i) for i in row]
print('输入:',str(A))
l = len(A)
Backtrack(0)
输入:1,2,3,4
预期输出: [1, 2, 3, 4][1, 2, 3, 4][1, 2, 4, 3][1, 3, 2, 4][1, 3, 4, 2][1, 4, 3, 2][1, 4, 2, 3][2, 1, 3, 4][2, 1, 4, 3][2, 3, 1, 4][2, 3, 4, 1][2, 4, 3, 1][2, 4, 1, 3][3, 2, 1, 4][3, 2, 4, 1][3, 1, 2, 4][3, 1, 4, 2][3, 4, 1, 2][3, 4, 2, 1][4, 2, 3, 1][4, 2, 1, 3][4, 3, 2, 1][4, 3, 1, 2][4, 1, 3, 2][4, 1, 2, 3]