題目
給定n種物品和乙個容量為v的揹包,物品i的體積是wi,其價值為ci。
(每種物品只有乙個)
問:如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?
面對每個物品,我們只有選擇放入或者不放入兩種選擇,每種物品只能放入一次。
我們用之前同樣的思路來走一遍試試
假設只剩下最後一件物品,我們有兩種選擇
1.剩餘空間足夠時,選擇放入
2.剩餘空間不足時,不放入
所以我們有兩個最優的子結構:
1.容量為v的揹包放入i-1件物品的最優選擇
2.容量為v-w[i]的揹包放入i-1件物品的最優選擇
所以,綜合起來就是:
i 件物品放入容量為v的揹包的最優選擇:
max(容量為v的揹包放入i-1件物品的最優選擇,容量為v-w[i]的揹包放入i-1件物品的最優選擇+c[i])
我們用f[i] [v]表示前 i 件物品放入容量為 v 的揹包中可以獲得的最大價值。
用子問題定義狀態:
其狀態轉移方程是:f[i] [v] = max。
我們先假設
揹包總容量為v = 12
物品的容量陣列為 w = [4, 6, 2, 2, 5, 1]
價值陣列為 c = [8, 10, 6, 3, 7, 2]
我們每次從左至右,儲存前一次的資料
從上至下時,儲存前一行的資料
所以我們總的來說只用儲存一行的資料,空間複雜度為o(v)
時間複雜度為o(n*v),空間複雜度為o(v);
但是,如果我們用原始的遞迴辦法去做,即排列組合的方法去做時
時間複雜度為o(2^n);
那麼當v很大,n較小時,比如v=1000,n=6時,用遞迴只用計算2^6=64次,而備受推崇的動態規劃就需要計算1000*6=6000次
所以說,演算法沒有絕對的好壞,關鍵要看應用的慘景
01揹包問題 (動態規劃演算法)
0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波 面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...
動態規劃演算法 01揹包問題
動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...
動態規劃演算法之0 1揹包問題
我們首先來看一下問題 乙個旅行者有乙個容量為c的揹包,現在有n種物品,每件的重量分別是w1 w 2 w n,每件物品的價值分別為v1 v 2 v n,需要將物品放入揹包中,要怎麼樣放才能保證揹包中物品的總價值最大?具體資料如下表,其中n 4,c 8。前面已經對動態規劃的基本概念做了詳細的講解,動態規...