Python基于回溯法子集树模板解决选排问题示例


Posted in Python onSeptember 07, 2017

本文实例讲述了Python基于回溯法子集树模板解决选排问题。分享给大家供大家参考,具体如下:

问题

从n个元素中挑选m个元素进行排列,每个元素最多可重复r次。其中m∈[2,n],r∈[1,m]。

如:从4个元素中挑选3个元素进行排列,每个元素最多可重复r次。

分析

解x的长度是固定的,为m。

对于解x,先排第0个位置的元素x[0],再排第1个位置的元素x[1]。我们把后者看作是前者的一种状态,即x[1]是x[0]的一种状态!!

一般地,把x[k]看作x[k-1]的状态空间a中的一种状态,我们要做的就是遍历a[k-1]的所有状态。

那么,套用子集树模板即可。

代码

'''
选排问题
从n个元素中挑选m个元素进行排列,每个元素最多可重复r次。其中m∈[2,n],r∈[1,m]。
作者:hhh5460
时间:2017年6月2日 09时05分
声明:此算法版权归hhh5460所有
'''
n = 4
a = ['a','b','c','d']
m = 3  # 从4个中挑3个
r = 2  # 每个元素最多可重复2
x = [0]*m  # 一个解(m元0-1数组)
X = []   # 一组解
# 冲突检测
def conflict(k):
  global n, r, x, X, a
  # 部分解内的元素x[k]不能超过r
  if x[:k+1].count(x[k]) > r:
    return True
  return False # 无冲突
# 用子集树模板实现选排问题
def perm(k): # 到达第k个元素
  global n,m, a, x, X
  if k == m: # 超出最尾的元素
    print(x)
    #X.append(x[:]) # 保存(一个解)
  else:
    for i in a: # 遍历x[k-1]的状态空间a,其它的事情交给剪枝函数!
      x[k] = i
      if not conflict(k): # 剪枝
        perm(k+1)
# 测试
perm(0) # 从x[0]开始排列

效果图

 Python基于回溯法子集树模板解决选排问题示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python自定义函数的创建、调用和函数的参数详解
Mar 11 Python
使用Python操作Elasticsearch数据索引的教程
Apr 08 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
20个常用Python运维库和模块
Feb 12 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
python调用自定义函数的实例操作
Jun 26 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
在pycharm中创建django项目的示例代码
May 28 Python
python利用faker库批量生成测试数据
Oct 15 Python
python中pycryto实现数据加密
Apr 29 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 #Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 #Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 #Python
python中利用Future对象异步返回结果示例代码
Sep 07 #Python
python中利用Future对象回调别的函数示例代码
Sep 07 #Python
Python标准库之itertools库的使用方法
Sep 07 #Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 #Python
You might like
随机广告显示(PHP函数)
2006/10/09 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
php中socket的用法详解
2014/10/24 PHP
php利用事务处理转账问题
2015/04/22 PHP
四个PHP非常实用的功能
2015/09/29 PHP
js字符串操作总结(必看篇)
2016/11/22 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
vue.js 上传图片实例代码
2017/06/22 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
分享Python文本生成二维码实例
2016/01/06 Python
Python字符串格式化输出方法分析
2016/04/13 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
如何查找网页漏洞
2016/06/22 面试题
校班主任推荐信范文
2013/12/03 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
会计专业求职信范文
2015/03/19 职场文书
培训班开班主持词
2015/07/02 职场文书
教师节祝酒词
2015/08/11 职场文书
环保建议书作文300字
2015/09/14 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis