演算法 0 1揹包問題

2021-09-26 21:23:27 字數 1050 閱讀 1691

給定 揹包的容積 w,物品的體積陣列 weights 和價值陣列 values, 求揹包能裝入物品的最大價值。

例如:w=6

weights = ;

values = ;

輸出最大價值 :10

動態規劃法, 0-1 knapsack.乙個物品只能用一次。

則遞推式為dp[i][j] = max(dp[i-1][j-w] + v,dp[i-1][j]),可以看到不管第 i 件物品有沒有加到揹包中,最大價值都和 i-1 相關,則變數 i 對於最大價值的影響可消去,優化為一維陣列遞推式:

每個物品加入後遍歷更新陣列

dp[0]:0 dp[1]:2 dp[2]:2 dp[3]:2 dp[4]:2 dp[5]:2 dp[6]:2

dp[0]:0 dp[1]:2 dp[2]:4 dp[3]:6 dp[4]:6 dp[5]:6 dp[6]:6

dp[0]:0 dp[1]:2 dp[2]:4 dp[3]:6 dp[4]:6 dp[5]:7 dp[6]:9

dp[0]:0 dp[1]:2 dp[2]:4 dp[3]:6 dp[4]:6 dp[5]:8 dp[6]:10

/**

* @param w 揹包最大體積容量

* @param weights 物品體積陣列

* @param values 物品價值陣列

* @return 返回最大價值

**/public int knapsack

(int w

, int[

] weights, int[

] values)

else }}

return dp[length][w];*/

int[

] dp =

newint[w

+1];

// 一維陣列優化

for(int i =

1; i <= length; i++)}

}return dp[w]

;}

演算法(揹包問題 01揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...

演算法 0 1揹包問題

揹包問題是演算法中的乙個經典問題,它有很多子問題,比如0 1揹包問題,完全揹包問題,多重揹包問題等等。而今天所說的0 1揹包問題的原始描述為 現在有n件物品和乙個最大承載重量為m的揹包,要從這n件物品中選擇其中的k 1 k n 件,使得所選擇的物品的價值總和最大且其總重量不超過揹包的最大載重量。這n...

演算法 01揹包問題

對於乙個物品,選擇放還是不放,只有兩個選擇,故屬於01問題.物品 public class item 第n件物品,放入剩餘容量為leftweight的揹包中所獲得的最大價值 static int getmaxvalue listlist,int n,int leftweight 如果當前n的容量超過...