動態規劃之0 1揹包問題

2022-03-30 05:00:55 字數 1068 閱讀 9750

給定n個物品和乙個揹包,物品i的重量是wi,其價值是vi,揹包的容量為w,及最大載重量不超過w,在限定的總重量w內,我們如何選擇物品,才能使物品的總價值最大。

具體問題:

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

m(i,j)表示當前揹包的容量為j,可選擇的物品範圍為i,i+1,i+2....n。所以揹包問題的遞推式如下

m(i,j)=(wi<=j), m(i+1,j)(wi>j)};(但看公式還是比較抽象的)

下面具體的分析

現在我們才去的分析方法是從左往右,從下往上。

首先動態規劃過程的表如下

這張表是從下往上從左往右的分析

當i=5時表示當前只有e乙個物體,j從1到10慢慢增加表示揹包容量在不斷的增大,當j<=3的時候,揹包的當前容量是小於e的,所以此時不能將物品加入到揹包當中。當j>=4的時候恰好只有乙個e所以揹包最大為6。

當i=1,j=8的時候m[2][8]=9(不加上a),當加上a之後之後m[i+1][j-w[i]]+v[i]=m[2][6]+v[1]=

9+6=15.根據前面的公式m[i][j]=m[1][8]=15/其他的分析也是一樣的。不過要注意順序是從左往右,從下往上。

**如下

#include using namespace std;

int n=5;//物品的件數

int c=10;//揹包的容量

int w=;//物品的重量

int v=;//物品的價值

int m[6][11]=;//記錄規劃過程

int x[100];//儲存路徑

void knapsack()

void tracesack()

{ int t=c;

for(int i=1;i

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...