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学习 流程控制语句详解
Jun 01 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
python Opencv将图片转为字符画
Feb 19 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
python基于event实现线程间通信控制
Jan 13 Python
Python request操作步骤及代码实例
Apr 13 Python
Python logging模块写入中文出现乱码
May 21 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
Python基于time模块表示时间常用方法
Jun 18 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 Python
python实现商品进销存管理系统
May 30 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 Try Catch异常测试
2009/03/01 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php限制ip地址范围的方法
2015/03/31 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
super关键字的用法
2012/04/10 面试题
儿科护士实习自我鉴定
2013/10/17 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
公司节能减排方案
2014/05/16 职场文书
财务务虚会发言材料
2014/10/20 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript