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安装使用命令行交互模块pexpect的基础教程
May 12 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
Python部署web开发程序的几种方法
May 05 Python
Python探索之修改Python搜索路径
Oct 25 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
python的re模块使用方法详解
Jul 26 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
python第三方库学习笔记
Feb 07 Python
Django实现列表页商品数据返回教程
Apr 03 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 Python
python实现双向链表原理
May 25 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
10个实用的PHP代码片段
2011/09/02 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
node.js基础知识小结
2018/02/26 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python中删除某个元素的方法解析
2019/11/05 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
机电工程学生自荐信范文
2013/12/07 职场文书
根叔历年演讲稿
2014/05/20 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
机动车登记业务委托书
2014/10/08 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
新郎接新娘保证书
2015/05/08 职场文书
本科毕业论文致谢词
2015/05/14 职场文书