01揹包問題 遞迴 動態規劃求解

2021-10-07 06:45:11 字數 2526 閱讀 8193

//使用記憶化搜尋:(存在重疊子問題:對於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 求解將哪些物品裝入揹包可使價值總和最大。動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決...