回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
参考博文:python回溯法 子数集模板
1、数字组合问题
找出从自然数1、2、3、…、n中任取r个数的所有组合。
例如,n=5,r=3的所有组合为:

1,2,3
1,2,4
1,2,5
1,3,4
1,3,5
1,4,5
2,3,4
2,3,5
2,4,5
3,4,5

分析
换个角度,r=3的所有组合,相当于元素个数为3的所有子集。因此,在遍历子集树的时候,对元素个数不为3的子树剪枝即可。注意,这里不妨使用固定长度的解。
直接套用子集树模板。

'''数字组合问题'''n = 5
r = 3
a = [1,2,3,4,5] # 五个数字x = [0]*n # 一个解(n元0,1数组) 固定长度
X = []    # 一组解def conflict(k):global n, r, xif sum(x[:k+1]) > r: # 部分解的长度超出rreturn Trueif sum(x[:k+1]) + (n-k-1) < r: # 部分解的长度加上剩下长度不够rreturn Truereturn False # 无冲突# 套用子集树模板
def comb(k): # 到达第k个元素global n, x, Xif k >= n:  # 超出最尾的元素#print(x)X.append(x[:]) # 保存(一个解)else:for i in [1, 0]: # 遍历元素 a[k] 的两种选择状态:1-选择,0-不选x[k] = iif not conflict(k): # 剪枝comb(k+1)# 根据一个解x,构造对应的一个组合
def get_a_comb(x):global areturn [y[0] for y in filter(lambda s:s[1]==1, zip(a, x))]# 根据一组解X,构造对应的一组组合
def get_all_combs(X):return [get_a_comb(x) for x in X]# 测试
comb(0)
print(X)
print(get_all_combs(X))

2、0-1背包问题

n = 3                  # 物品数量
c = 30                 # 包的载重量
w = [20, 15, 15]       # 物品重量
v = [45, 25, 25]       # 物品价值maxw = 0               # 符合条件的最大重量
maxv = 0               # 符合条件的最大价值
bag = [0, 0, 0]
bags = []
bestbag = None# 冲突检测
def conflick(k):global bag, w, c# bag内的前k个物品已超重,冲突if sum([y[0] for y in filter(lambda x:x[1] == 1, zip(w[:k+1], bag[:k+1]))]) > c:return Truereturn False# 套用子树集模板
def backpack(k):  # 到达第k个物品global bag, maxv, maxw, bestbagif k==n:      # 超出最后一个物品,判断结果是否为最优cv = get_a_pack_value(bag)cw = get_a_pack_weight(bag)if cv> maxv:     # 价值大的优先maxv = cvbestbag = bag[:]if cv == maxv and cw < maxw:  # 价值相同,重量轻的优先maxw = cwbestbag = bag[:]else:for i in [1,0]:   # 遍历两种状态 选取1,不选取0bag[k] = i    # 解的长度是固定的if not conflick(k): # 剪枝backpack(k+1)# 根据 bag 计算重量
def get_a_pack_weight(bag):global w"""语法以下是 filter() 方法的语法:filter(function, iterable)"""return sum([y[0] for y in filter(lambda x:x[1]==1,zip(w,bag))])# 根据 bag 计算价值
def get_a_pack_value(bag):global vreturn sum([y[0] for y in filter(lambda x:x[1]==1,zip(v,bag))])# 测试
backpack(0)
print(bestbag, get_a_pack_value(bestbag))

python 回溯法 子集树模板相关推荐

  1. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  2. python 回溯法 子集树模板 系列 —— 1、8 皇后问题

    问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的 ...

  3. python 回溯法 子集树模板 系列 —— 5、取物搭配问题

    问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...

  4. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

  5. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例

    本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...

  6. python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

    本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...

  7. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例

    本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...

  8. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

  9. python回溯方法的模板_实例讲解Python基于回溯法子集树模板实现图的遍历功能

    这篇文章主要介绍了Python基于回溯法子集树模板实现图的遍历功能,结合实例形式分析了Python使用回溯法子集树模板针对图形遍历问题的相关操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Py ...

最新文章

  1. 链表中倒数第k个节点 1
  2. 将 Microsoft Excel 导入至 MySQL
  3. android linux应用安装位置,Android中App安装位置详解
  4. 设计模式系列-组合模式
  5. 为什么要使用叶脊(leaf-spine)拓扑网络zz
  6. android自定义更新,Android 完美解决自定义preference与ActivityGroup UI更新的问题
  7. 用jframe给MySQL输入数据_如何从JTextField输入Info到sql数据库?
  8. 【bat批处理】常用bat批处理内部命令简介
  9. 【Windows】bat | 服务 | bat作为服务 | bat转exe
  10. WPF 设置本地打印的纸张和方向
  11. 解决Xcode 13.2 不兼容 ios15.4 问题
  12. 笔记本外接显示器无声音
  13. 妖人柴:都移动互联网时代了,为什么还要建网站?
  14. HTMl+CSS 模仿京东网登录页面
  15. Cg学习记录002 之Uniform参数
  16. IIBA - CBAP考试感悟
  17. MeterSphere | 超好用的开源测试平台
  18. 浅谈数据结构-最短路径
  19. php选课系统(学生端)功能
  20. html表单判断字符数,JS判断字符串长度,结合element el-input el-form 表单验证(英文占1个字符,中文汉字占2个字符)...

热门文章

  1. WMS仓库商品预警需求分析(附代码解析)
  2. java标签uri,JSP自定义标签-定制URI
  3. C 已知华氏温度F与摄氏温度C的关系是:C=5/9*(F-32),编写程序,计算华氏温度F为-10,0,10,20......290°C时,摄氏温度C的值。
  4. 后端报错fastJson.Json.toJson错误
  5. Low-light images enhancement系列:Kindling the Darkness: A Practical Low-light Image Enhancer
  6. ims对接vos过程中出现的无声单通解决办法
  7. 3dmax面部表情绑定
  8. 基于求导的快速exp()算法,exp()快速计算,exp导数算法,exp函数C语言实现
  9. Android Stuidio —— 一键拨号
  10. ecm 面向连接电子模型开发工具包