算法训练之回溯法
Posted amcomputer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法训练之回溯法相关的知识,希望对你有一定的参考价值。
什么是回溯法
题目1
已知完成一个简单的工作需要1天,中等难度,需要2天,困难需要4天,如果未来有n个工作日,请返回所以可能的任务排列数。
如 输入:3
输出:3 这里3表示3种方案,{[1,1,1], [1.2],[2,1]}
解法1
采用递归的方法输出最终的方案数:
def solution(n,count):
if (n===0):
count +=1
if (n>=4):
solution(n-4)
if (n>=2):
solution(n-2)
if (n>=1):
solution(n-1)
解法2
使用回溯法解决
def climb_stairs(k): # 走第k步
global n, temp, results
if sum(temp) == n: # 已走的所有步数之和等于楼梯总台阶数
results.append(temp)
print(temp)
else:
for i in [1, 2,4]: # 第k步这个元素的状态空间为[1,2,4]
temp.append(i)
if sum(temp)<=n: # 剪枝
# print(x)
climb_stairs(k+1)
temp.pop() # 回溯
# 测试
if __name__ == "__main__":
'''爬楼梯'''
n = 3 # 楼梯阶数
temp = [] # 一个解(长度不固定,1-2数组,表示该步走的台阶数)
results = [] # 一组解
climb_stairs(0) # 走第0步
print(len(results))
输出(n=3时):
题目2
问题:n阶楼梯,每次只能走一步或两步,输出所有方案
LeetCode有这道题, 求解思路也是一样的,换汤不换药
def climb_stairs(k): # 走第k步
global n, temp, results
if sum(temp) == n: # 已走的所有步数之和等于楼梯总台阶数
results.append(temp)
print(temp)
else:
for i in [1, 2]: # 第k步这个元素的状态空间为[1,2]
temp.append(i)
if sum(temp)<=n: # 剪枝
# print(x)
climb_stairs(k+1)
temp.pop() # 回溯
# 测试
if __name__ == "__main__":
'''爬楼梯'''
n = 3 # 楼梯阶数
temp = [] # 一个解(长度不固定,1-2数组,表示该步走的台阶数)
results = [] # 一组解
climb_stairs(0) # 走第0步
print(len(results))
以上是关于算法训练之回溯法的主要内容,如果未能解决你的问题,请参考以下文章