//使用記憶化搜尋:(存在重疊子問題:對於index,c這一資料對可能求解多次)
int[
] memo;
/** * 用[0...index]的物品,填充容積為c的揹包的最大價值
* @param w:物體的重量
* @param v:物體的價值
* @param index:當前考慮的物體的index序列號
* @param c:當前所剩容量
* @return
*/private
intbestvalue
(int
w,int[
] v,
int index,
int c)
// 判斷memo[index][c]中是否有值,有值的話不用繼續多餘重複的計算了,直接返回
if(memo[index]
[c]!=-1
)//嘗試向背包中放入新的物品
//第一種情況:當前的物品不放入揹包中,從[0...index-1]的來填充
int res =
bestvalue
(w,v,index-
1,c)
;//第二種情況:當前的物品放入揹包中
if(c >= w[index]
) memo[index]
[c]= res;
return res;
}/**
* 01揹包問題:遞迴演算法(自頂向下)
* @param w
* @param v
* @param c
* @return
*/public
intpackage01
(int
w,int[
] v,
int c)
}return
bestvalue
(w,v,n-
1,c)
;}
/**
* 01揹包問題:動態規劃(自底向上)
* @param w
* @param v
* @param c
* @return
*/public
intpackage01sec
(int
w,int[
] v,
int c)
int[
] memo =
newint
[n][c+1]
;for
(int i=
0;i//先處理最基礎的問題:memo[0][j]第0行的每乙個元素的值:遍歷列
for(
int j=
0;j<=c;j++
)//遞推的過程
for(
int i=
1;i}return memo[n-1]
[c];
}
/**
* 01揹包問題:動態規劃(自底向上):改進:空間複雜度由o(n*c)變為o(2*c)
* @param w
* @param v
* @param c
* @return
*/public
intpackage01secmod
(int
w,int[
] v,
int c)
int[
] memo =
newint[2
][c+1]
;for
(int i=
0;i<
2;i++)}
//先處理最基礎的問題:memo[0][j]第0行的每乙個元素的值:遍歷列
for(
int j=
0;j<=c;j++
)//遞推的過程
for(
int i=
1;i}return memo[
(n-1)%
2][c];
}
/**
* 01揹包問題:動態規劃(自底向上):改進:空間複雜度由o(2*c)就是o(c)
* @param w
* @param v
* @param c
* @return
*/public
intpackage01secmodsec
(int
w,int[
] v,
int c)
int[
] memo =
newint
[c+1];
for(
int i=
0;i1;i++
)//先處理最基礎的問題:memo[j]第0行的每乙個元素的值:遍歷列
for(
int j=
0;j<=c;j++
)//遞推的過程
for(
int i=
1;ireturn memo[c]
;}
01揹包問題 動態規劃求解
時間限制 1 sec 記憶體限制 128 mb 提交 48 解決 17 給定n種物品和乙個揹包,物品i的重量是wi,其價值為vi,問如何選擇裝入揹包的物品,使得裝入揹包的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只能有兩種選擇,裝入或者不裝入,不能裝入多次,也不能部分裝入。第一行輸入物品...
0 1揹包問題,動態規劃求解
1.什麼是0 1揹包問題?有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?舉例int v 每個物品對應的價值 int w 每個物品對應的重量 int bag 10 揹包最大承重10 0 1揹包問題 public static void main st...
用動態規劃求解0 1揹包問題
0 1揹包問題描述 有n件物品和乙個重量為m的揹包。每種物品均只有一件 第i件物品的重量是w i 價值是p i 求解將哪些物品裝入揹包可使價值總和最大。動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決...