乙個揹包有一定的承重cap,有n件物品,每件都有自己的價值,記錄在陣列v中,也都有自己的重量,記錄在陣列w中,每件物品只能選擇要裝入揹包還是不裝入揹包,要求在不超過揹包承重的前提下,選出物品的總價值最大。
給定物品的重量w價值v及物品數n和承重cap。請返回最大總價值。
經典動態規劃問題,類似於找零錢問題,只不過在填數字的時候需要計算本次放入物品的價值,並且在下次填數的時候需要比較。
定義二維陣列,行數為可用的物品的件數,列數為揹包總重量。略有不同的是需要將件數跟總重量需要置零來作為初始狀態。
首先定義初始狀態,res[0][0]代表共有零件物品,揹包可以裝0kg重量,自然res[0][0]=0,並且很顯然,res[0][i]與res[i][0]都為0,初始狀態設定完畢。
對於之後的矩陣,res[i][j]即為第i 件物品,來填入容量為j kg的包中,是否填入,判斷是否填入的依據自然是使得res[i][j]取得最大的值,狀態一共有兩種
1、不填入第i件物品,那麼res[i][j]=res[i-1][j],2、填入第i件物品,那麼就需要揹包中需要有足夠的空間,否則只能是一情況,在滿足空間條件後,res[i][j]=res[i-1][j-w[i-1]]+v[i-1](此處需要注意,因為無論在w還是v中均加入了乙個0作為初始值,所以在這裡遍歷到i時實際上在陣列中對應的是i-1)。
揹包問題實際上與之前的湊零錢問題類似,都是慢慢的擴大物品數量與總數,由小問題的最優解來求得大問題的最優解。**如下
class backpack
res[i][j]=m;}}
return res[n][cap];}};
Python 刷題筆記 揹包問題
刷動態規劃的第二天,有些自閉,剛靠著大魔王的歌緩過來了。關於動態規劃,我還處於看題解時哦哦哦 看題目時?的階段,所以整理的點不深。除了昨天推給大家的鏈結,今天也是發現了一位刷題大牛的寶藏,不僅動態規劃,各類演算法都做了整理 引導,屬實 respect 動態規劃專題 關於動態規劃,我現階段的理解是在窮...
刷題心得 揹包問題的列舉方式
以0 1揹包為例,到底正序列舉還是倒序列舉?正序列舉還是倒敘列舉的原則取決於0 1揹包的性質,即乙個階段的狀態 1個物品 不能被放進揹包兩次。如果正序列舉的話,當前階段被上乙個階段更新,而下乙個階段仍然可能被上乙個階段更新。多以就相當於乙個物品被放進了揹包兩次。違背0 1揹包的規則。而完全揹包就不需...
wikioi 3130 CYD刷題 揹包)
下午,cyd要刷題了,已知cyd有n題可刷,但他只有m分鐘的時間,而且他的智慧型值為q,也就是說他只能做出難度小於等於q的題目。已知每題可得積分ai,需花費時間bi,難度為ci,問cyd最多可得多少積分。n m q ai bi ci 可得最多積分 4 20 10 20 3 7 30 7 9 30 1...