Python基于回溯法子集樹模板解決0-1背包問題實(shí)例
本文實(shí)例講述了Python基于回溯法子集樹模板解決0-1背包問題。分享給大家供大家參考,具體如下:
問題
給定N個(gè)物品和一個(gè)背包。物品i的重量是Wi,其價(jià)值位Vi ,背包的容量為C。問應(yīng)該如何選擇裝入背包的物品,使得放入背包的物品的總價(jià)值為最大?
分析
顯然,放入背包的物品,是N個(gè)物品的所有子集的其中之一。N個(gè)物品中每一個(gè)物品,都有選擇、不選擇兩種狀態(tài)。因此,只需要對每一個(gè)物品的這兩種狀態(tài)進(jìn)行遍歷。
解是一個(gè)長度固定的N元0,1數(shù)組。
套用回溯法子集樹模板,做起來不要太爽?。。?/p>
代碼
'''0-1背包問題'''
n = 3 # 物品數(shù)量
c = 30 # 包的載重量
w = [20, 15, 15] # 物品重量
v = [45, 25, 25] # 物品價(jià)值
maxw = 0 # 合條件的能裝載的最大重量
maxv = 0 # 合條件的能裝載的最大價(jià)值
bag = [0,0,0] # 一個(gè)解(n元0-1數(shù)組)長度固定為n
bags = [] # 一組解
bestbag = None # 最佳解
# 沖突檢測
def conflict(k):
global bag, w, c
# bag內(nèi)的前k個(gè)物品已超重,則沖突
if sum([y[0] for y in filter(lambda x:x[1]==1, zip(w[:k+1], bag[:k+1]))]) > c:
return True
return False
# 套用子集樹模板
def backpack(k): # 到達(dá)第k個(gè)物品
global bag, maxv, maxw, bestbag
if k==n: # 超出最后一個(gè)物品,判斷結(jié)果是否最優(yōu)
cv = get_a_pack_value(bag)
cw = get_a_pack_weight(bag)
if cv > maxv : # 價(jià)值大的優(yōu)先
maxv = cv
bestbag = bag[:]
if cv == maxv and cw < maxw: # 價(jià)值相同,重量輕的優(yōu)先
maxw = cw
bestbag = bag[:]
else:
for i in [1,0]: # 遍歷兩種狀態(tài) [選取1, 不選取0]
bag[k] = i # 因?yàn)榻獾拈L度是固定的
if not conflict(k): # 剪枝
backpack(k+1)
# 根據(jù)一個(gè)解bag,計(jì)算重量
def get_a_pack_weight(bag):
global w
return sum([y[0] for y in filter(lambda x:x[1]==1, zip(w, bag))])
# 根據(jù)一個(gè)解bag,計(jì)算價(jià)值
def get_a_pack_value(bag):
global v
return sum([y[0] for y in filter(lambda x:x[1]==1, zip(v, bag))])
# 測試
backpack(0)
print(bestbag, get_a_pack_value(bestbag))
效果圖

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python-pymysql獲取字段名稱-獲取內(nèi)容方式
這篇文章主要介紹了python-pymysql獲取字段名稱-獲取內(nèi)容方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
Python使用異步線程池如何實(shí)現(xiàn)異步TCP服務(wù)器交互
這篇文章主要介紹了Python使用異步線程池如何實(shí)現(xiàn)異步TCP服務(wù)器交互問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
使用python腳本自動創(chuàng)建pip.ini配置文件代碼實(shí)例
這篇文章主要介紹了使用python腳本自動創(chuàng)建pip.ini配置文件代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
YOLOv5車牌識別實(shí)戰(zhàn)教程(一)引言與準(zhǔn)備工作
這篇文章主要介紹了YOLOv5車牌識別實(shí)戰(zhàn)教程(一)引言與準(zhǔn)備工作,在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車牌識別,幫助你快速掌握YOLOv5車牌識別技能,需要的朋友可以參考下2023-04-04
Django實(shí)現(xiàn)自定義路由轉(zhuǎn)換器
有時(shí)候上面的內(nèi)置的url轉(zhuǎn)換器并不能滿足我們的需求,因此django給我們提供了一個(gè)接口可以讓我們自己定義自己的url轉(zhuǎn)換器,那么如何實(shí)現(xiàn),本文就來介紹一下2021-05-05

