python数据结构实现(七):回溯、分治和动态规划及相关LeetCode题

1 回溯

1.1 python利用回溯算法求解八皇后问题

'''
利用回溯算法求解八皇后问题
'''
class FindQueen:
    def __init__(self):
        self.total = 0      # 八皇后解的个数
        self.table = [[0 for i in range(8)] for i in range(8)]    # 8 x 8 的棋盘
        
    def findQueen(self, row):
        if row > 7:       # 八皇后问题有解了(已经排到了第9行)
            self.total += 1
            self.printQueen()
            return
        for coloumn in range(8):
            if self.check(row, coloumn):
                self.table[row][coloumn] = 1
                self.findQueen(row+1)
                self.table[row][coloumn] = 0       # 每趟递归退出后都需将这趟递归每行置1的位置清零
    
    def check(self, row, col):
        for n in range(8):       # 检查行列两个方向的有效性
            if self.table[n][col] or self.table[row][n]:
                return False
            
        # 检查左对角线    
        lf = [self.table[row+i][col+j] for i,j in zip(range(-7,8),range(7,-8,-1)) \
              if 0 <= row+i < 8 and 0 <= col+j < 8 and self.table[row+i][col+j]==1]
        if len(lf):
            return False
        
        # 检查右对角线
        rt = [self.table[row+i][col+j] for i,j in zip(range(-7,8),range(-7,8)) \
              if 0 <= row+i < 8 and 0 <= col+j < 8 and self.table[row+i][col+j]==1]
        if len(rt):
            return False
        
        return True
    
    def printQueen(self):
        for val in self.table:
            print(val)
        print('\n')

solutions = FindQueen()

solutions.findQueen(0)
print(solutions.total)

1.2 python利用回溯算法求解 0-1 背包问题

def bag01(N, V, C, W):
	'''
	:param N:N件物品
	:param V:Value数组,对应每件物品的价值
	:param C:Capacity,指背包的最大容量
	:param W:Weight数组,对应每件物品的重量
	'''
    bestResult = [0] * N; curResult = [0] * N
    curCost = 0; curValue = 0; bestValue = 0
    
    def backtracking(depth):
        nonlocal curCost,curValue,bestValue
        if depth > N-1:
            if curValue > bestValue:
                bestValue = curValue
                bestResult[:] = curResult[:]
                print(bestResult)
                print(bestValue)
            
        else:
            for i in [0, 1]:       # 取或不取这件物品
                curResult[depth] = i
                
                if i == 0:     # 不取这件物品
                    backtracking(depth+1)
                else:
                    if curCost + W[depth] <= C:
                        curCost += W[depth]
                        curValue += V[depth]
                        backtracking(depth+1)
                        # 往上回溯,恢复现场
                        curCost -= W[depth]
                        curVal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值