動態規劃是一種演算法思想,通過從問題的頂部開始,不斷解決其中的小問題,使得問題得以解決.我們通常會用到陣列或者表(即二維陣列)來記錄小問題的解決過程.
在解決一些演算法問題,我們常常會使用到遞迴來解決問題,但是遞迴的效率又比較的低;這個時候我們可以使用到動態規劃來解決問題;它可以大大提高我們**的效率.,接下來博主會通過乙個經典的案例來帶大家淺了解一下動態規劃思想
假設有乙個揹包, 揹包的最大容量是13,有下列物品:
a. weight: 3, value: 4
b. weight: 4, vlaue: 6
b. weight: 5, value: 7
d. weight: 7, value: 9
那麼我們怎麼放才能得到最大收益
**:/**
* storage 表示揹包的容量
* weights 存放物品重量的陣列
* values 存放物品價值的陣列
* n 物品的標記
*/function
solution1
(storage, weights, values, n)
}//返回較大的數
function
max(a, b)
let values =[4
,6,7
,9];
let weights =[4
,5,6
,7];
let n =4;
let storage =13;
console.
log(
solution1
(storage,weights,values,n)
);
執行結果:
分析可以通過遞迴簡單的解決這個問題,但是效率確實不高,可讀性也比較差
縱向表示揹包容量, 橫向表示物品編號
容量 /編號01
2345
6789
1011
121300
0000
0000
0000
0100
0444
4444
4444
2000
4666
1010
1010
1010103
0004
67710
1313
1313
171740
0046
771013
1313
1517
17**:
let values =[4
,6,7
,9];
let weights =[3
,4,5
,7];
let n =4;
let storage =13;
console.
log(
solution1
(storage,weights,values,n));
function
solution2
(storage, weights, values, n)
// 判斷每種物品面對不同揹包容量時的最大收益
for(
let i =
0; i <= n; i++
)/* 揹包容量大於物品重量時,最大收益分兩種情況:
*/else}}
// 最大收益值
let max_value = table[n]
[storage]
;let which = n;
// 記錄所裝的物品
let goods =
// 記錄揹包剩餘容量
let rest = storage;
while
(rest >
0&& which >0)
which--;}
console.
log(
`揹包最大的收益為:
$,拿取的物品有$`
);}solution2
(storage, weights, values, n)
;
執行結果:
分析通過動態規劃,我們不僅能得到最大的價值,同時在每一步的過程也很清晰.在遞迴中沒能得到存放的物品時那些,在這裡也得到了解決.
動態規劃能提高我們**的效率, 在一些複雜的演算法問題中還是很有用的!
動態規劃解決揹包問題
一 需求 二 思路分析 三 實現 四 優化 上述 的問題 path陣列的遍歷 優化後的 a 我現在有一張表,記錄了商品名稱,重量及 b 我還有乙個給定容量的揹包,這個揹包用來存放商品 c 要求物品裝入揹包的價值最大,且重量不能超出 d 要求轉入的物品不能重複 即01揹包問題 a 定義兩個一維陣列來分...
動態規劃解決01揹包問題
0 1揹包 動態規劃 問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值是vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?問題分析 對於一種問題,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。eg 物品個數n 5,物品重量w n 物品價值v...
動態規劃解決0 1揹包問題
把揹包問題抽象化 x1,x2,xn,其中 xi 取0或1,表示第 i 個物品選或不選 vi表示第 i個物品的價值,wi表示第 i 個物品的體積 重量 建立模型,即求max v1x1 v2x2 vnxn 約束條件,w1x1 w2x2 wnxn定義v i,j 當前揹包容量 j,前 i 個物品最佳組合對應...