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 相关文章推荐
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Python清空文件并替换内容的实例
Oct 22 Python
python实现五子棋人机对战游戏
Mar 25 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
python中seaborn包常用图形使用详解
Nov 25 Python
python 实现目录复制的三种小结
Dec 04 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
Python文件夹批处理操作代码实例
Jul 21 Python
python爬虫基础之urllib的使用
Dec 31 Python
python 实现体质指数BMI计算
May 26 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
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
javascript 写类方式之三
2009/07/05 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
基于jquery的模态div层弹出效果
2010/08/21 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Vue指令指令大全
2019/02/09 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Django如何使用redis作为缓存
2020/05/21 Python
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
饭店工作计划书
2014/01/10 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang