Python基于回溯法子集树模板解决数字组合问题实例


Posted in Python onSeptember 02, 2017

本文实例讲述了Python基于回溯法子集树模板解决数字组合问题。分享给大家供大家参考,具体如下:

问题

找出从自然数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, x
  if sum(x[:k+1]) > r: # 部分解的长度超出r
    return True
  if sum(x[:k+1]) + (n-k-1) < r: # 部分解的长度加上剩下长度不够r
    return True
  return False # 无冲突
# 套用子集树模板
def comb(k): # 到达第k个元素
  global n, x, X
  if k >= n: # 超出最尾的元素
    #print(x)
    X.append(x[:]) # 保存(一个解)
  else:
    for i in [1, 0]: # 遍历元素 a[k] 的两种选择状态:1-选择,0-不选
      x[k] = i
      if not conflict(k): # 剪枝
        comb(k+1)
# 根据一个解x,构造对应的一个组合
def get_a_comb(x):
  global a
  return [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))

效果图

Python基于回溯法子集树模板解决数字组合问题实例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python使用新浪微博api上传图片到微博示例
Jan 10 Python
深入解析Python中的线程同步方法
Jun 14 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
Python实现图片拼接的代码
Jul 02 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
python re库的正则表达式入门学习教程
Mar 08 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
python中使用while循环的实例
Aug 05 Python
python scrapy爬虫代码及填坑
Aug 12 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 #Python
基于python 字符编码的理解
Sep 02 #Python
Python实现的简单模板引擎功能示例
Sep 02 #Python
Python实现Logger打印功能的方法详解
Sep 01 #Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 #Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 #Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 #Python
You might like
php数组函数array_key_exists()小结
2015/12/10 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
Python文件及目录操作实例详解
2015/06/04 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
代理班主任的自我评价
2014/02/04 职场文书
欢送退休感言
2014/02/08 职场文书
高中军训感言200字
2014/02/23 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
法人身份证明书
2015/06/18 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
PHP新手指南
2021/04/01 PHP
Python基础之tkinter图形化界面学习
2021/04/29 Python
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL