
【計】 knapsack problem
背包問題(Knapsack Problem)是組合優化領域的經典問題,其核心目标是在限定容量下選擇物品組合,使總價值最大化。根據漢英詞典解釋,"背包"對應英文"knapsack",常作為算法研究的典型場景。以下從定義、分類、數學模型及應用場景展開分析:
0-1背包問題
每個物品僅能選擇一次(裝入/不裝入),屬于離散優化問題。該模型常用于密碼學和資源分配場景,算法複雜度為NP難。
分數背包問題
允許分割物品(如液體類物資),屬于連續優化問題,可通過貪心算法在多項式時間内求解。
标準0-1背包公式為:
$$
begin{aligned}
text{最大化} & sum_{i=1}^n v_i xi
text{約束條件} & sum{i=1}^n w_i x_i leq W
& x_i in {0,1} quad (i=1,2,...,n)
end{aligned}
$$
其中$v_i$為物品價值,$w_i$為重量,$W$為背包容量。
該問題的擴展形式如多維背包、多目标背包等仍在密碼學和人工智能領域持續産生新研究成果。
背包問題是計算機科學與數學中的經典優化問題,屬于NP完全問題。其核心目标是在資源有限條件下實現價值最大化,具體定義如下:
給定一組物品,每個物品有重量 ( w_i ) 和價值 ( vi ),在背包容量上限 ( W ) 的約束下,選擇物品組合使總價值最大。數學表達式為: $$ begin{aligned} text{最大化} & sum{i=1}^n v_i xi text{約束條件} & sum{i=1}^n w_i x_i leq W & x_i in {0,1} quad (text{0-1背包}) end{aligned} $$ 其中 ( x_i ) 表示是否選擇第 ( i ) 個物品。
采用動态規劃算法,定義二維狀态數組 ( dp[i][j] ) 表示前 ( i ) 個物品在容量 ( j ) 時的最大價值。狀态轉移方程為: $$ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w_i] + v_i) $$ 可通過空間優化将二維數組壓縮為一維數組實現。
def knapsack(weights, values, capacity):
n = len(weights)
dp =* (capacity + 1)
for i in range(n):
for j in range(capacity, weights[i]-1, -1):
dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
return dp[capacity]
此代碼通過逆向遍曆實現空間優化。
巴克碼不過布-馬二氏征草灰堿草酸鹽處理的代數文字題電離粒子俘獲二極管感覺異常高钴玫紅鹽關健鍋爐最低水位報警器恒組分共聚合輝光觸發器減量操作符攪亂戰術幾何線框圖柯林氏窺器冷笑的歐洲經濟共同體平液球管親軟骨的實驗診斷視應變手工書寫帳簿格式收集水淋巴水潤軸承屬性賦值外軌域錯合物