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如何为图片添加水印
Nov 25 Python
详谈python在windows中的文件路径问题
Apr 28 Python
Python3.5字符串常用操作实例详解
May 01 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
Python函数装饰器原理与用法详解
Aug 16 Python
Python PIL图片添加字体的例子
Aug 22 Python
深入了解Python在HDA中的应用
Sep 05 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
python如何随机生成高强度密码
Aug 19 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
python给list排序的简单方法
Dec 10 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
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
jquery与js实现全选功能的区别
2017/06/11 jQuery
js中时间格式化的几种方法
2018/07/22 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python实现淘宝秒杀脚本
2020/06/23 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
Python urllib.request对象案例解析
2020/05/11 Python
python map比for循环快在哪
2020/09/21 Python
Python通过字典映射函数实现switch
2020/11/06 Python
应聘医学检验人员自荐信
2013/09/27 职场文书
新闻编辑自荐信
2013/11/03 职场文书
应届生污水处理求职信
2013/11/06 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
研发工程师岗位职责
2014/04/28 职场文书
高中军训的心得体会
2014/09/01 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
员工自我工作评价
2015/03/06 职场文书
Redis入门教程详解
2021/08/30 Redis