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使用mailbox打印电子邮件的方法
Apr 30 Python
Python如何实现文本转语音
Aug 08 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Django urls.py重构及参数传递详解
Jul 23 Python
Python queue队列原理与应用案例分析
Sep 27 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
关于python中的xpath解析定位
Mar 06 Python
django 读取图片到页面实例
Mar 27 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 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/12/06 PHP
php 结果集的分页实现代码
2009/03/10 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
Redis构建分布式锁
2017/03/28 PHP
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python聊天室实例程序分享
2016/01/05 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
python生成word合同的实例方法
2021/01/12 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
《记承天寺夜游》教学反思
2014/02/16 职场文书
护士实习求职信
2014/06/22 职场文书
工作表现证明
2015/06/15 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
python中if和elif的区别介绍
2021/11/07 Python