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 pdb调试方法分享
Jan 21 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
PyQt5每天必学之切换按钮
Aug 20 Python
python 执行shell命令并将结果保存的实例
May 11 Python
详解Python中的四种队列
May 21 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
Jul 03 Python
简单了解python的break、continue、pass
Jul 08 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
PHP新手上路(八)
2006/10/09 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
json 实例详细说明教程
2009/10/31 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
Python求凸包及多边形面积教程
2020/04/12 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Python运算符+与+=的方法实例
2021/02/18 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
建筑学推荐信
2013/11/03 职场文书
心理学专业毕业生推荐信范文
2013/11/21 职场文书
护士毕业实习感言
2014/03/05 职场文书
团支部推优材料
2014/05/21 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
自主招生自荐信范文
2015/03/04 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
信息技术研修心得体会
2016/01/08 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL