一維陣列解01揹包問題(總結各種大神的分析)

2021-08-21 16:43:50 字數 1841 閱讀 9071

經歷過拼多多的筆試題,就知道該多學學動態規劃演算法了。。

問題描述:

有n和重量和價值分別為wi,vi的物品,從這些物品中挑選出總質量不超過c的物品,如何挑選使得總價值量最大?

思路分析:序號

weight

value12

3456

78910

a250

5588

1313

141616b

3301

3889

1111

1414c5

6011

8899

91414d

4801

1889

9999

e210

1111

1111

1這個**是自底向上從左到右的順序,e2單元格表示最多容重2時,只有e物品可選時,最大價值為1

c3表示最多容重為3時,只有c.d.e物品可選時,最大價值為1,因為d和e都大於3,裝不了。

a8的值是14,怎麼得到?

根據01揹包的狀態轉換方程: f[i,j] = max

f[i-1][j]表示b[8]的值為11,f[i-1],j-wi]表示b6的值為9,9+5=14>11,因此a8的值為14。

當揹包容量為j時,已經放入了i件物品,最大價值為d[i]d[j]

當第i件物品比揹包容量還大時,不能放,所以,d[i][j]=d[[i-1][j];

當第i件物品比揹包容量小時,就要判斷兩種情況:不放的話,和上式相同,放的話,揹包容量-第i件物品的質量再去裝前i-1件物品,所得得最大價值加上第i件物品的價值,兩者較大值即為最優解。d[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])

#include #include #include #include #include using namespace std;

#define empty

#define inf -65536

const int c=10;//容量capability

int n;//物品個數

int w[15],v[15];//物品個數,物品質量weight,物品價值value

int dp[1000][c+1]=;

int main()

}cout<從空間花費從大到小來構成for迴圈的話,就可以直接用一維陣列來儲存物品數-1 的值。

當揹包容量為j時,已經放入了i件物品,最大價值為d[j]

當第i件物品比揹包容量還大時,d[j]=d[j];

當第i件物品比揹包容量小時,就要判斷兩種情況:不放的話,和上式相同,放的話,揹包容量-第i件物品的質量再去裝前i-1件物品,所得得最大價值加上第i件物品的價值,兩者較大值即為最優解。d[j]=max(dp[j],dp[j-w[i]]+v[i])

#include #include #include #include #include using namespace std;

#define empty

#define inf -65536

const int c=10;//容量capability

int n;//物品個數

int w[15],v[15];//物品個數,物品質量weight,物品價值value

int dp[c+1];

int main()

}cout

}

0 1揹包問題(一維陣列解法)

0 1揹包問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題的特點是 每種物品只有一件,可以選擇放或者不放。演算法基本思想 利用動態規劃思想 子問題為 f i v 表示前i件物品恰放入乙個...

板子 0 1揹包問題 一維陣列

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

0 1揹包使用一維陣列

使用滾動陣列將空間優化到了2 v,在揹包九講中提到了使用一維陣列也可以達到同樣的效果,個人認為這也是滾動思想的一種,由於使用一維陣列解01揹包會被多次用到,完全揹包的一種優化實現方式也是使用一維陣列,所以我們有必要理解這種方法。如果只使用一維陣列f 0 v 我們要達到的效果是 第i次迴圈結束後f v...