給定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揹包的最優解具有最優子結構特性。與一般揹包問題...