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

首頁 > 編程 > Python > 正文

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

2020-01-04 16:43:21
字體:
來源:轉載
供稿:網友

本文實例講述了Python基于回溯法子集樹模板解決找零問題。分享給大家供大家參考,具體如下:

問題

有面額10元、5元、2元、1元的硬幣,數量分別為3個、5個、7個、12個。現在需要給顧客找零16元,要求硬幣的個數最少,應該如何找零?或者指出該問題無解。

分析

元素——狀態空間分析大法:四種面額的硬幣看作4個元素,對應的數目看作各自的狀態空間,遍歷狀態空間,其它的事情交給剪枝函數。

解的長度固定:4

解的編碼:(x1,x2,x3,x4) 其中x1∈[0,1,2,3], x2∈[0,1,2,3,4,5], x3∈[0,1,2,...,7], x4∈[0,1,2,...,12]

求最優解,增添全局變量:best_x, best_num

套用回溯法子集樹模板。

代碼

'''找零問題'''n = 4a = [10, 5, 2, 1] # 四種面額b = [3, 5, 7, 12] # 對應的硬幣數目(狀態空間)m = 53 # 給定的金額x = [0]*n  # 一個解(n元0-b[k]數組)X = []  # 一組解best_x = [] # 最佳解best_num = 0 # 最少硬幣數目# 沖突檢測def conflict(k):  global n,m, x, X, a, b, best_num  # 部分解的金額已超  if sum([p*q for p,q in zip(a[:k+1], x[:k+1])]) > m:    return True  # 部分解的金額加上剩下的所有金額不夠  if sum([p*q for p,q in zip(a[:k+1], x[:k+1])]) + sum([p*q for p,q in zip(a[k+1:], b[k+1:])]) < m:    return True  # 部分解的硬幣個數超best_num  num = sum(x[:k+1])  if 0 < best_num < num:    return True  return False # 無沖突# 回溯法(遞歸版本)def subsets(k): # 到達第k個元素  global n, a, b, x, X, best_x, best_num  if k == n: # 超出最尾的元素    #print(x)    X.append(x[:]) # 保存(一個解)    # 計算硬幣數目,若最佳,則保存    num = sum(x)    if best_num == 0 or best_num > num:      best_num = num      best_x = x[:]  else:    for i in range(b[k]+1): # 遍歷元素 a[k] 的可供選擇狀態: 0, 1, 2, ..., b[k] 個硬幣      x[k] = i      if not conflict(k): # 剪枝        subsets(k+1)# 測試subsets(0)print(best_x)

效果圖

Python,回溯法,子集樹模板,找零問題

 

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万州区| 鹤山市| 色达县| 张掖市| 乌拉特中旗| 昂仁县| 镇远县| 周宁县| 宜兰市| 沧源| 大庆市| 聂拉木县| 横峰县| 华蓥市| 尉犁县| 游戏| 安西县| 临武县| 沛县| 固原市| 英山县| 花莲县| 昌乐县| 锡林浩特市| 姜堰市| 石首市| 甘德县| 东港市| 巴楚县| 东丽区| 东城区| 鹿邑县| 阳山县| 兴安县| 凯里市| 财经| 绥棱县| 泸州市| 尚义县| 磐石市| 万安县|