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中将字典转换为列表的方法
Sep 21 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
python正则表达式re之compile函数解析
Oct 25 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
Django中使用Celery的方法示例
Nov 29 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
python3.6环境安装+pip环境配置教程图文详解
Jun 20 Python
Python发送邮件的实例代码讲解
Oct 16 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
详解Python 中的 defaultdict 数据类型
Feb 22 Python
90行Python代码开发个人云盘应用
Apr 20 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
python实现贪吃蛇游戏
2020/03/21 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python requests.get带header
2020/05/05 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
小孩百日宴答谢词
2014/01/15 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
会计学专业求职信
2014/07/17 职场文书
清明节寄语2015
2015/03/23 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
Oracle笔记
2021/04/05 Oracle
react 路由Link配置详解
2021/11/11 Javascript
Python+tkinter实现高清图片保存
2022/03/13 Python