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)。因此,只需要對(duì)每一個(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)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python中將圖像轉(zhuǎn)換為PDF的方法實(shí)現(xiàn)
本文主要介紹了Python中將圖像轉(zhuǎn)換為PDF的方法實(shí)現(xiàn),主要使用img2pdf和PyPDF2軟件包,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程
這篇文章主要介紹了工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程,幫助大家更好的學(xué)習(xí)算法數(shù)據(jù)結(jié)構(gòu),感興趣的朋友可以了解下2020-10-10
一維信號(hào)小波去噪原理解析及python實(shí)現(xiàn)方式
這篇文章主要介紹了一維信號(hào)小波去噪原理解析及python實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
在pyqt5中QLineEdit里面的內(nèi)容回車發(fā)送的實(shí)例
今天小編就為大家分享一篇在pyqt5中QLineEdit里面的內(nèi)容回車發(fā)送的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
解決keras,val_categorical_accuracy:,0.0000e+00問題
這篇文章主要介紹了解決keras,val_categorical_accuracy:,0.0000e+00問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
手把手教你怎么用Python實(shí)現(xiàn)zip文件密碼的破解
之前在家里的老電腦中,發(fā)現(xiàn)一個(gè)加密zip壓縮包,由于時(shí)隔太久忘記密碼了,依稀記得密碼是6位字母加數(shù)字,網(wǎng)上下載了很多破解密碼的軟件都沒有效果,于是想到自己用Python寫一個(gè)暴力破解密碼的腳本,需要的朋友可以參考下2021-05-05
Django 對(duì)象關(guān)系映射(ORM)源碼詳解
這篇文章主要介紹了Django 對(duì)象關(guān)系映射(ORM)源碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08

