国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python基于回溯法子集樹模板解決選排問題示例

2020-02-16 10:10:32
字體:
來源:轉載
供稿:網友

本文實例講述了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 = 4a = ['a','b','c','d']m = 3  # 從4個中挑3個r = 2  # 每個元素最多可重復2x = [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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁河县| 蒲城县| 广饶县| 甘南县| 桂阳县| 霍林郭勒市| 澎湖县| 天津市| 云林县| 彰化县| 翼城县| 手游| 大荔县| 宁海县| 江达县| 清丰县| 高台县| 林州市| 固阳县| 兴国县| 揭西县| 东方市| 英山县| 和政县| 陕西省| 桃源县| 巴彦淖尔市| 彩票| 常德市| 汽车| 元阳县| 高邮市| 息烽县| 鄂伦春自治旗| 平定县| 如皋市| 荔波县| 眉山市| 新野县| 新密市| 花垣县|