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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
python对html代码进行escape编码的方法
May 04 Python
Python数据类型学习笔记
Jan 13 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
Python 查看文件的读写权限方法
Jan 23 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
10款最好的Python开发编辑器
Jul 03 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
python中列表的含义及用法
May 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php将时间差转换为字符串提示
2011/09/07 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
js函数和this用法实例分析
2020/03/13 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python使用wxPython实现计算器
2018/01/30 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
html5与css3小应用
2013/04/03 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
蛋糕店创业计划书范文
2014/09/21 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
求职意向书范本
2015/05/11 职场文书
食堂卫生管理制度
2015/08/04 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers