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实现360皮肤按钮控件示例
Feb 21 Python
跟老齐学Python之字典,你还记得吗?
Sep 20 Python
python实现调用其他python脚本的方法
Oct 05 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
查看django版本的方法分享
May 14 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
Python selenium的基本使用方法分析
Dec 21 Python
使用keras根据层名称来初始化网络
May 21 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+MySQL 制作简单的留言本
2009/11/02 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
js切换光标示例代码
2013/10/10 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
js实现随机抽奖
2020/03/19 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python实现XML文件解析的示例代码
2018/02/05 Python
python实现Windows电脑定时关机
2018/06/20 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
用python批量移动文件
2021/01/14 Python
说出一些常用的类,包,接口
2014/09/22 面试题
自我鉴定范文200字
2013/10/02 职场文书
八年级物理教学反思
2014/01/19 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
经费申请报告
2015/05/15 职场文书