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实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
详解python发送各类邮件的主要方法
Dec 22 Python
安装Python的教程-Windows
Jul 22 Python
Python多层装饰器用法实例分析
Feb 09 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
解决python3 pika之连接断开的问题
Dec 18 Python
python爬虫 模拟登录人人网过程解析
Jul 31 Python
python return逻辑判断表达式实现解析
Dec 02 Python
Python之变量类型和if判断方式
May 05 Python
python如何查看网页代码
Jun 07 Python
七个非常实用的Python工具包总结
Jun 15 Python
4种方法python批量修改替换列表中元素
Apr 07 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+jquery实时显示网站在线人数的方法
2015/01/04 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python调用百度语音REST API
2018/08/30 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
宿舍违规用电检讨书
2014/02/16 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
关于环保的广播稿
2015/12/17 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书