揹包問題

0-1揹包優化

  • 題目描述:有n件物品和一個容量爲v的揹包,每件物品只有一個,第i件物品的重量爲c[i],價值爲w[i],求解將哪些物品放入揹包中,是得這些物品的總重量不超過v且總價值最大。
  • 基本思路利用動態規劃來解決此問題,用f[i][v]表示前i件物品剛好放入一個容量爲v的揹包中所得到的價值,對於物品i,若是放入揹包中,那麼子問題就是前i-1件物品剛好放入容量爲v-c[i]的揹包中,若物品i不放入揹包中,則子問題就是前i件物品剛好放入容量爲v的揹包中,因此狀態轉移方程爲f[i][v]=max{f[i-1][v],f[i-1][v-c[i]+w[i]}。注意剛好兩字代表f[i][v]只有在前i件物品的總量剛好爲i時有意義,因此最終答案是f[n][0...v]中的最大值。 
  • 空間複雜度優化:以上方法的時間,空間複雜度均爲O(n*v),但空間複雜度能夠優化到O(v)。思路就是用f[v]來表示上面定義的狀態f[i][v],由於f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]兩個子問題遞推而來,因此在每次主循環中,以v...0的次序來遞推便可,由於如果以0...v的次序來推的話,f[v]則是由f[i-1][v]和f[i][v-c[i]](f[i-1][v-c[i])已被覆蓋)兩個狀態遞推而來。

徹底揹包問題spa

  •  題目描述:有n件物品和一個容量爲v的揹包,每件物品有無限個,第i件物品的重量爲c[i],價值爲w[i],求解將哪些物品放入揹包中,是得這些物品的總重量不超過v且總價值最大。
  • 基本思路:將此問題轉化爲0-1揹包問題求解。把第i種物品拆成費用爲c[i]*2^k、價值爲w[i]*2^k的若干件物品,其中k知足c[i]*2^k<v,由於無論選取幾件第i種物品,總能夠表示成2^k的和。經過這種轉化能夠將徹底揹包問題轉化爲0-1揹包問題,時間,空間複雜度均爲不變。
相關文章
相關標籤/搜索