Python基于回溯法子集樹模板解決0-1背包問題實(shí)例
本文實(shí)例講述了Python基于回溯法子集樹模板解決0-1背包問題。分享給大家供大家參考,具體如下:
問題
給定N個物品和一個背包。物品i的重量是Wi,其價值位Vi ,背包的容量為C。問應(yīng)該如何選擇裝入背包的物品,使得放入背包的物品的總價值為最大?
分析
顯然,放入背包的物品,是N個物品的所有子集的其中之一。N個物品中每一個物品,都有選擇、不選擇兩種狀態(tài)。因此,只需要對每一個物品的這兩種狀態(tài)進(jìn)行遍歷。
解是一個長度固定的N元0,1數(shù)組。
套用回溯法子集樹模板,做起來不要太爽!??!
代碼
'''0-1背包問題''' n = 3 # 物品數(shù)量 c = 30 # 包的載重量 w = [20, 15, 15] # 物品重量 v = [45, 25, 25] # 物品價值 maxw = 0 # 合條件的能裝載的最大重量 maxv = 0 # 合條件的能裝載的最大價值 bag = [0,0,0] # 一個解(n元0-1數(shù)組)長度固定為n bags = [] # 一組解 bestbag = None # 最佳解 # 沖突檢測 def conflict(k): global bag, w, c # bag內(nèi)的前k個物品已超重,則沖突 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個物品 global bag, maxv, maxw, bestbag if k==n: # 超出最后一個物品,判斷結(jié)果是否最優(yōu) cv = get_a_pack_value(bag) cw = get_a_pack_weight(bag) if cv > maxv : # 價值大的優(yōu)先 maxv = cv bestbag = bag[:] if cv == maxv and cw < maxw: # 價值相同,重量輕的優(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ù)一個解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ù)一個解bag,計(jì)算價值 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中將圖像轉(zhuǎn)換為PDF的方法實(shí)現(xiàn)
本文主要介紹了Python中將圖像轉(zhuǎn)換為PDF的方法實(shí)現(xiàn),主要使用img2pdf和PyPDF2軟件包,具有一定的參考價值,感興趣的可以了解一下2023-08-08工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程
這篇文章主要介紹了工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程,幫助大家更好的學(xué)習(xí)算法數(shù)據(jù)結(jié)構(gòu),感興趣的朋友可以了解下2020-10-10一維信號小波去噪原理解析及python實(shí)現(xiàn)方式
這篇文章主要介紹了一維信號小波去噪原理解析及python實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06在pyqt5中QLineEdit里面的內(nèi)容回車發(fā)送的實(shí)例
今天小編就為大家分享一篇在pyqt5中QLineEdit里面的內(nèi)容回車發(fā)送的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06解決keras,val_categorical_accuracy:,0.0000e+00問題
這篇文章主要介紹了解決keras,val_categorical_accuracy:,0.0000e+00問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07手把手教你怎么用Python實(shí)現(xiàn)zip文件密碼的破解
之前在家里的老電腦中,發(fā)現(xiàn)一個加密zip壓縮包,由于時隔太久忘記密碼了,依稀記得密碼是6位字母加數(shù)字,網(wǎng)上下載了很多破解密碼的軟件都沒有效果,于是想到自己用Python寫一個暴力破解密碼的腳本,需要的朋友可以參考下2021-05-05