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 相关文章推荐
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python及PyCharm下载与安装教程
Nov 18 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
Python实现二叉搜索树BST的方法示例
Jul 30 Python
python 提取文件指定列的方法示例
Aug 07 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
python代码区分大小写吗
Jun 17 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
pymysql模块使用简介与示例
Nov 17 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
Zerg基本策略
2020/03/14 星际争霸
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
python实现输入数字的连续加减方法
2018/06/22 Python
Python之循环结构
2019/01/15 Python
Python netmiko模块的使用
2020/02/14 Python
Django实现celery定时任务过程解析
2020/04/21 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
.NET笔试题(20个问题)
2016/02/02 面试题
可口可乐广告词
2014/03/20 职场文书
买房协议书范本
2014/10/23 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
手把手教你导入Go语言第三方库
2021/08/04 Golang
redis中lua脚本使用教程
2021/11/01 Redis
pandas中对文本类型数据的处理小结
2021/11/01 Python