0-1揹包問題:對於一組不同重量、不可分割的物品,物品有n個,選擇一些物品裝入揹包,在滿足揹包最大承重w的前提下求出揹包的最大重量。
這個問題可以用回溯演算法實現,可以參考《回溯演算法》這一篇,也可以使用動態規劃的思想去解決。
所謂動態規劃,簡單說就是把乙個問題分為多個階段,每個階段對應乙個決策y or n,使用乙個狀態陣列記錄記錄每乙個階段的狀態,根據當前階段的狀態陣列,推導出下乙個階段的狀態陣列,動態地向前推進。
對於揹包問題就是,將問題分為n個階段,n表示物品個數,每個階段都會決策這個物品是否要放入揹包中:放入或者不放入。決策執行之後,揹包中的物品重量就會出現多種狀態,對應到遞迴樹中就是就是有很多不同節點。我們把遞迴樹每一層中重複的節點合併,只記錄不同的狀態,然後基於上一層的狀態陣列,推導出下一階段的狀態陣列。每一層中的狀態個數最多為w個即揹包的承重。使用二維陣列states[n][w+1]表示狀態陣列,記錄每個物品決策執行後可以達到的不同狀態。
這裡例子中物品重量為陣列:[2,2,4,6,3].
* 物品個數
*/private
int n =5;
/** * 揹包承受的最大重量
*/private
int w =9;
/** * weight: 物品重量,n: 物品個數,w: 揹包可承載重量
*/public
intf
(int
weight,
int n,
int w)
// 動態規劃狀態轉移
for(
int i =
1; i < n;
++i)
}// 把第 i 個物品放入揹包
for(
int j =
0; j <= w-weight[i]
;++j)}}
// 輸出結果
for(
int i = w; i >=0;
--i)
}return0;
}時間複雜度從**的兩層迴圈中可以看出o(n*w),n表示物品個數,w表示總承重。
空間複雜度因為要申請乙個n乘以w+1的二維陣列,所以記憶體消耗比較大,所以是空間換時間的思路,不過可以優化。
就是使用乙個一維陣列來代替二維陣列。
優化**如下:
/**
* 動態規劃空間複雜度優化(相對於上邊的f函式)
* @param weight: 物品重量 [2,2,4,6,3],n: 物品個數,w: 揹包可承載重量 9
* @return
*/public
intf2
(int
weight,
int n,
int w)
// 動態規劃
for(
int i =
1; i < n;
++i)}}
// 輸出結果
for(
int i = w; i >=0;
--i)
}return0;
}
在考慮揹包總承重下物品最大重量的前提下,再加入乙個物品的價值,計算最終的揹包中可以容納的最大總價值是多少?
**:
/**
物品的總價值
*/private
int[
] value =
;/**
* 在考慮物品價值的情況下,計算在承重限制條件下的揹包中最大總價值
* @param weight 物品總量陣列
* @param value 物品價值陣列
* @param n 物品個數
* @param w 揹包承重
* @return
*/public
intsuperf
(int
weight,
int[
] value,
int n,
int w)
} states[0]
[0]=
0;if(weight[0]
<= w)
// 動態規劃,狀態轉移
for(
int i =
1; i < n;
++i)
}// 選擇第 i 個物品
for(
int j =
0; j <= w - weight[i]
;++j)}}
}// 找出最大值
int maxvalue =-1
;for
(int j =
0; j <= w;
++j)
}return maxvalue;
}
動態規劃初識
適合用動態規劃的問題特徵 可以分解成相互重疊的若干子問題 滿足最優性原理 結構性質 該問題的最優解中也包含著其子問題的最優解。一般地,子問題的聯絡體現在某種遞推關係,通過這種遞推計算可以把問題的解儲存起來,後期直接使用,避免重複運算。簡單的dp例子 遞推關係 m i j m i 1 j m i j ...
初識動態規劃
有乙個矩陣map,它每個格仔有乙個權值。從左上角的格仔開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。給定乙個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100.輸入輸出樣例 第一行,輸入n,m表示這個矩陣...
初識動態規劃
let maxw 0 最大可放重量 let weight 2 2,4 6,3 物品重量 let n weight.length let w 11 揹包最大可承受重量 let men for let i 0 i n i men.push f 0,0 11 function f i,cw f i 1,c...