演算法 揹包問題理解

2021-08-13 17:39:19 字數 1412 閱讀 9762

不知道您是否知道揹包問題。做這個題可以幫助您更好地理解遞迴演算法。題的內容是:

乙個揹包可以裝下重量為weight的物品,現在有n件物品的集合s,其中物品的重量分別是w0, w1, w2 ... wn-1, 問是否有一種物品組合,使得其重量剛好等於weight.

p.s:如果您沒做過這個題,建議您先自己思考下,然後再往下看。

這個題乍一看,可能不容易聯絡到遞迴演算法。因為,它的遞迴特點不明顯。一般的遞迴問題,會明確的提出乙個縮小的變數。比如階乘n!中的n,然後我們就可以按照提議寫遞迴了。

我先把**粘上來,讓大家先有個直觀的了解。

defknap_rec(weight, wlist, n):

ifweight == 0:

return trueifweight <0

or(weight >0

andn<1):

return falseifknap_rec(weight - wlist[n-1], wlist, n-1):

print("item"+ str(n)+":", wlist[n-1])

return trueifknap_rec(weight, wlist, n-1):

return trueelse:

return false

(weight:揹包能稱下的物品重量; wlist:物品的列表; n:物品的數量)

其實,做這個題,要想好一種劃分。這個答案的劃分是,2種情況:選最後乙個物品,和不選最後乙個物品。為什麼是最後乙個?其實無所謂,目的就是為了要有乙個劃分。有了這樣乙個劃分後,遞迴的真容就慢慢浮現出來了。第一層遞迴:選最後乙個,第二層遞迴:不選最後乙個。。。最後發現是false,那麼遞迴不成立,如果是true,那麼遞迴成立。具體的實現是,knap_rec(weight - wlist[n-

1], wlist, n-

1)代表選最後一件商品,因為n-1的同時weight減去了商品列表中的最後乙個商品。

knap_rec(weight, wlist, n-

1)代表不選最後乙個商品,因為n-1,weight沒變化,說明最後乙個商品不在選擇範圍內,所以不影響weight。

總結:劃分對於遞迴很重要,它可以把一道題轉化成可以用遞迴求解的問題。

理解揹包問題

揹包問題總共有九種,0 1揹包式所有的基礎,所以首先研究0 1揹包 一 0 1揹包 問題陳述 有n件物品和乙個容量為v的揹包。第i件物品的費用是w,價值是v。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大若。1 動態規劃解決 f i,j 表示在前i件物品中選擇若干件放在承...

演算法(揹包問題 01揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...

演算法 揹包問題

揹包問題用逆序減少空間複雜度的情況下,揹包問題,如果是多維揹包 質量,容積,個數 則加矩陣維度 如果是01揹包,則逆序內迴圈,如果是完全揹包 每種物品個數不限 則順序內迴圈,如果是混合揹包 限制每種物品的個數 include using namespace std define maxn 110 d...