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 相关文章推荐
剖析Django中模版标签的解析与参数传递
Jul 21 Python
Python实现简单过滤文本段的方法
May 24 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
numpy中的meshgrid函数的使用
Jul 31 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
浅谈Python3中print函数的换行
Aug 05 Python
python中使用.py配置文件的方法详解
Nov 23 Python
jupyter 添加不同内核的操作
Feb 06 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中防止伪造跨站请求的小招式
2011/09/02 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
php中in_array函数用法分析
2014/11/15 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
php中static和const关键字用法分析
2016/12/07 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
python类定义的讲解
2013/11/01 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
python 遍历pd.Series的index和value
2019/11/26 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
毕业生就业自荐书
2013/12/15 职场文书
战略合作意向书范本
2014/04/01 职场文书
房屋委托书范本
2014/04/04 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
2016春节慰问信范文
2015/03/25 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
校园广播稿范文
2015/08/19 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书