
【計】 knapsack algorithm
knapsack; pack
algorithm; arithmetic
【計】 ALG; algorithm; D-algorithm; Roth's D-algorithm
【化】 algorithm
【經】 algorithm
背包算法(Knapsack Algorithm)是組合優化領域的經典問題,其核心目标是在限定重量約束下,從一組物品中選擇總價值最大的子集。該問題名稱源于現實場景中“用有限容量的背包裝最有價值物品”的決策需求。
$$max sum_{i=1}^n v_i xi quad text{s.t.} quad sum{i=1}^n w_i x_i leq W,x_i in {0,1}$$
其中(v_i)為價值,(w_i)為重量,(W)為背包容量。
動态規劃是解決背包問題的核心方法。以0-1背包為例,定義二維數組(dp[i][j])表示前(i)個物品在容量(j)下的最大價值,遞推公式為:
$$dp[i][j] = max(dp[i-1][j],dp[i-1][j-w_i] + v_i)$$
時間複雜度為(O(nW)),空間複雜度可通過滾動數組優化。
背包算法主要涉及兩個領域的含義,需根據上下文區分理解:
這是計算機算法領域的核心問題,用于解決資源分配的最優解。
問題定義
給定容量為V的背包和N件物品,每件物品有重量$c_i$和價值$w_i$。目标是在不超過背包容量的前提下,選擇物品使總價值最大。每個物品隻能選或不選(即0-1背包問題)。
核心狀态轉移方程
定義$f[i][v]$為前i件物品放入容量v背包的最大價值,其遞推公式為:
$$
f[i][v] = max{ f[i-1][v], f[i-1][v-c_i] + w_i }
$$
該方程通過比較"不選當前物品"與"選當前物品"兩種情況得出最優解。
空間優化技巧
通過逆序遍曆背包容量,可将二維數組壓縮為一維數組,空間複雜度從$O(NV)$降為$O(V)$。優化後的僞代碼如下:
dp = *(V+1)
for i in 1..N:
for v in V..c_i:
dp[v] = max(dp[v], dp[v-c_i] + w_i)
由Merkle和Hellman于1978年提出的公鑰加密體系,其特點包括:
動态規劃背包問題還有多種變體:完全背包(物品無限)、多重背包(數量限制)等。實際應用場景包括投資決策、資源調度、DNA序列比對等需要最優組合的領域。
如需具體代碼實現或數學證明細節,可參考CSDN文庫的《背包算法全面解析》或博客園相關技術文章。
【别人正在浏覽】