Python基于回溯法子集树模板解决选排问题示例

 更新时间:2017年09月07日 11:00:11   作者:罗兵  
这篇文章主要介绍了Python基于回溯法子集树模板解决选排问题,简单描述了选排问题并结合实例形式分析了Python使用回溯法子集树模板解决选排问题的具体实现步骤与相关操作注意事项,需要的朋友可以参考下

本文实例讲述了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 Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • PyQt5实现界面(页面)跳转的示例代码

    PyQt5实现界面(页面)跳转的示例代码

    这篇文章主要介绍了PyQt5实现界面跳转的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • python列表推导式实现找出列表中长度大于5的名字

    python列表推导式实现找出列表中长度大于5的名字

    这篇文章主要介绍了python列表推导式实现找出列表中长度大于5的名字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 详解Python中enumerate函数的使用

    详解Python中enumerate函数的使用

    Python 的 enumerate() 函数就像是一个神秘的黑箱,它具有非常有用的高级用法。本文就来为大家详细讲一下它的使用,需要的可以参考一下
    2022-08-08
  • numpy.delete删除一列或多列的方法

    numpy.delete删除一列或多列的方法

    下面小编就为大家分享一篇numpy.delete删除一列或多列的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 十个简单使用的Python自动化脚本分享

    十个简单使用的Python自动化脚本分享

    今天小编给大家分享10个Python高级脚本,帮助我们减少无谓的时间浪费,提高工作学习中的效率。文中示例代码讲解详细,需要的可以参考一下
    2022-05-05
  • python网络编程学习笔记(五):socket的一些补充

    python网络编程学习笔记(五):socket的一些补充

    前面已经为大家介绍了python socket的一些相关知识,这里为大家补充下,方便需要的朋友
    2014-06-06
  • python兼容VBA的用法详解

    python兼容VBA的用法详解

    这篇文章主要介绍了python兼容VBA的用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Python使用OpenCV进行标定

    Python使用OpenCV进行标定

    这篇文章主要介绍了Python使用OpenCV进行标定,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Python爬取几千条相亲文案

    Python爬取几千条相亲文案

    这篇文章主要介绍了Python爬取几千条相亲文案,其实具体的说应该是通过Python写了一个简单的脚本在抓取公开的相亲文案,需要的小伙伴可以参考一下,希望对你有所帮助
    2021-12-12
  • Python基础教程之tcp socket编程详解及简单实例

    Python基础教程之tcp socket编程详解及简单实例

    这篇文章主要介绍了Python基础教程之tcp socket编程详解及简单实例的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论