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 相关文章推荐
动态创建类实例代码
Oct 07 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
在Python中使用HTML模版的教程
Apr 29 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
Python 多线程的实例详解
Sep 07 Python
Python实现的用户登录系统功能示例
Feb 05 Python
简单了解django索引的相关知识
Jul 17 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
Python 如何展开嵌套的序列
Aug 01 Python
pymysql模块使用简介与示例
Nov 17 Python
python异常中else的实例用法
Jun 15 Python
一文搞懂python异常处理、模块与包
Jun 26 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的类 功能齐全的发送邮件类
2006/10/09 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python中装饰器高级用法详解
2017/12/25 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
python实现矩阵打印
2019/03/02 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
python各层级目录下import方法代码实例
2020/01/20 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
Python是什么 Python的用处
2020/05/26 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
社区党支部公开承诺书
2015/04/29 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js