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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
python正则表达式匹配IP代码实例
Dec 28 Python
python 串行执行和并行执行实例
Apr 30 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
Python异常处理机制结构实例解析
Jul 23 Python
python内置模块之上下文管理contextlib
Jun 14 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
php csv操作类代码
2009/12/14 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
Highcharts入门之简介
2016/08/02 Javascript
简单学习vue指令directive
2016/11/03 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
如何编写jquery插件
2017/03/29 jQuery
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
python3.3实现乘法表示例
2014/02/07 Python
Python中os.path用法分析
2015/01/15 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
深入理解Django的中间件middleware
2018/03/14 Python
python求最大连续子数组的和
2018/07/07 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
护理专业学生职业生涯规划范文
2014/03/11 职场文书
公司委托书格式范文
2014/10/09 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python