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中bisect的用法
Sep 23 Python
python比较2个xml内容的方法
May 11 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
详解Django中Request对象的相关用法
Jul 17 Python
pyenv命令管理多个Python版本
Mar 26 Python
Python之Web框架Django项目搭建全过程
May 02 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
Python collections模块使用方法详解
Aug 28 Python
python实现机器人卡牌
Oct 06 Python
python中@property的作用和getter setter的解释
Dec 22 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
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
手机号码,密码正则验证
2014/09/04 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
Python中实现结构相似的函数调用方法
2015/03/10 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
python 基于wx实现音乐播放
2020/11/24 Python
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
自我评价200字分享
2013/12/17 职场文书
客服服务心得体会
2013/12/30 职场文书
初中化学教学反思
2014/01/23 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
开展创先争优活动总结
2014/08/28 职场文书
甘南现象心得体会
2014/09/11 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
通报表扬范文
2015/01/17 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
母亲节感言
2015/08/03 职场文书
情感电台广播稿
2015/08/18 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python