從遞迴到DP 01揹包問題初探

2021-10-02 00:27:22 字數 1216 閱讀 6263

目錄

問題描述:

1.純遞迴解決,容易溢位

2.記憶化搜尋法

3.由記憶化搜尋推導遞推關係,使用動態規劃法dp

備註:

有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

測試樣例:

n=4,=,w=5

42 3

1 23 4

2 25

#include #include using namespace std;

const int max_n=1000;

int n,w;

int w[max_n],v[max_n];

int dp[max_n+1][max_n+1];//記憶化陣列

//從第i個物品開始挑選總重小於j的部分

int rec(int i,int j)else if(j>n;

for(int i=0;i>w[i]>>v[i];

} cin>>w;

cout<#include using namespace std;

const int max_n=1000;

int n,w;

int w[max_n],v[max_n];

int dp[max_n+1][max_n+1];//記憶化陣列

//從第i個物品開始挑選總重小於j的部分

int rec(int i,int j)

int res;//剩餘物品

if(i==n)else if(j>n;

for(int i=0;i>w[i]>>v[i];

} cin>>w;

cout<#include using namespace std;

const int max_n=1000;

int n,w;

int w[max_n],v[max_n];

int dp[max_n+1][max_n+1];//記憶化陣列

int main()

cin>>w;

for(int i=n-1;i>=0;i--){

for(int j=0;j<=w;j++){

if(j1.遞推關係可以有很多種,此題至少三種

2.memset用法:

演算法筆記 揹包DP (0 1揹包)

1.0 1揹包 參考例題 hloj416採藥 二維解法 我們設f i j 為前i個物品放進容量為j的揹包的最大價值 設體積為v i 價值為w i 我們可以列舉i 1到n 和j 1到n 不難得出狀態轉移方程 f i j max 可以知道,當第i件物品不取時,總價值為f i 1 j 取得話,總價值為前i...

揹包DP(01揹包,多重揹包,完全揹包)

從前乙個轉態轉移過來,選還是不選 for int i 1 i n i else f i j f i 1 j 01揹包優化 滾動陣列 for int i 1 i n i for int j m j 1 j if weight i j f j max f j f j weight i value i 優...

ACM 程式設計競賽 DP 01揹包

輸入 n 4 w,v w 5 輸出 7 選擇0,1,3 暴力演算法 o 2 n include using namespace std const int maxn 100 int w maxn v maxn int n,w int rec int i,int j 從第i個商品開始挑選總重量小於j的...