動態規劃之揹包問題詳解

2021-08-22 19:12:03 字數 1700 閱讀 9445

狀態轉移方程(w[i]重量,v[i]值)

f[i][j] = max  (j-w[i]>=0)

f[i][j] = f[i-1][j];                                      (j-wl[i]< 0)

description

乙個人在收集骨頭,他有乙個容積為

v 的揹包,不同的骨頭體積和價值都有可能不同,現在他想知道他用這個揹包最多可以帶走多少價值的骨頭。

input

輸入資料的第一行是乙個正整數,表示一共有幾組資料。

每組測試資料首先輸入兩個整數

n, v (n<=1000, v <=1000)

表示骨頭的個數,和揹包的容積,

接下來輸入兩行:

第一行有

n個整數表示每個骨頭的價值,•第二行有n 個整數表示每個骨頭的體積;

1.用二維陣列實現

時o(n*w),空o(n*w)

#include#include#include#includeusing namespace std;

const int n=1e3+5;

int n,w[n],v[n];

int dp[n][n],w;

int main()

printf("\n");

}printf("%d\n",m-f[m-5]-d[n]);//f[m-5]除最後一次的總消費

}}return 0;

}

狀態轉移方程(對比01揹包)

f[i][v]=max (k為每種物品數量)

hrbust - 1053 (模板題)

1.二維陣列解法

時間複雜度

o(v*σ(v/c[i]))

///此方式超出記憶體,但可以理解下

#include#include#include#includeusing namespace std;

const int n=1e3+5;

int f[n][n],w[n],v[n];

int g,u,t;

int main()

}printf("%d\n",f[g]);

}return 0;

}

3.多重揹包

狀態轉移方程

hdu - 2191 (模板題)

//好好理解前兩種,這個就能寫出

#include#include#include#includeusing namespace std;

const int n=1e3+5;

int c,n,m,p[n],h[n],c[n];

int f[n][n];

int main(){

scanf("%d",&c);

while(c--){

memset(p,0,sizeof(p));

memset(h,0,sizeof(h));

memset(c,0,sizeof(c));

memset(f,0,sizeof(f));

scanf("%d%d",&n,&m);

for(int i=0;i歡迎指點,不喜勿噴

動態規劃之揹包問題

最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。然而文章給了許多案例分析,卻沒有很好的練習。說明 1 本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。...

動態規劃之揹包問題

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...

動態規劃之 揹包問題

前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。三種揹包問題 0 1揹包,完全揹包,多重揹包。0 1揹包 有n件物品和容量為v的揹包,求解將哪些物品放入揹包中可以使獲得的價值最大。f i v 表示將前i件物品恰好放入容量為v的揹包可以...