動態規劃DP 揹包問題 ACM

2021-08-29 23:22:05 字數 2356 閱讀 1029

首先上乙個神級的教程,揹包九講

這個教程講解詳細,讀懂了大有裨益。

還有一篇比較有幫助:

首先是乙個完全揹包問題(恰好裝滿):

ac code:

#includeusing namespace std;

const int maxn = 125;

int dp[maxn+5][maxn + 5];

int n = 0;

void solve()

for(int i = 1;i <= maxn;++i)

for(int i = 2;i <= maxn;++i) }}

int main()

return 0;

}

接下來是乙個多重揹包問題:

ac code:

#includeusing namespace std;

const int maxn = 300;

int dp[18][maxn + 5];//dp[i][j]表示使用前i種貨幣,湊出j元的方法數

int n = 0;

void solve()

for(int i = 1;i <= 17;++i)

for(int i = 2;i <= 17;++i)

} /*

for(int i = 1;i <= 4;++i)

} */

}int main()

return 0;

}

上面兩個問題的初始化是一樣的。揹包九講有段話話很重要

初始化的細節問題:

我們看到的求解最優解的揹包問題中,事實和桑有兩種不太相同的問法。

要求」揹包恰好裝滿「 時的最優解

不要求揹包一定要被裝滿時的最優解

我們上面所討論的就是第2種, 不要求揹包一定要被裝滿時的最優解。

一種區別這兩種問法的實現方法是在初始化的時候有所不不同。

如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了 dp[0]dp[0] 為0, 其他dp[1…w]均設為−∞dp[1…w]均設為−∞ ,這樣就可以保證最終得到 dp[w]dp[w] 是一種恰好裝滿揹包的最優解

如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該將dp[0…w]dp[0…w] 全部設為0。

這是為什麼呢?可以這樣理解:初始化的dpdp 陣列事實上就是在沒有任何物品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量為0的揹包可以在什麼也不裝的狀態下被 「恰好裝滿」 ,此時揹包價值為0。其他容量的揹包均沒有合法的解,屬於未定義的狀態,所以都應該被賦值為 −∞−∞ 。當前的合法解,一定是從之前的合法狀態推得的

如果揹包並非必須被裝滿,那麼任何容量的揹包都有乙個合法解 「什麼也不裝」,這個解的價值為0,所以初始化時狀態的值也就全部為0了。

接下來還是乙個多重揹包的問題:

ac code:

#includeusing namespace std;

const int maxn = 8e3 ;

int num[4];

int val[4] = ;

bool dp[maxn+10];

void solve()

} }for(int i = 1;i <= ma+1;++i) }}

int main()

solve();

} return 0;

}

加了最大值最小值限制的多重揹包:

ac code:

#includeusing namespace std;

const int maxn = 100 + 10;

int dp[maxn][maxn][maxn];//dp[i][j][k]表示使用了i種水果,有了j個盤,在第i種水果使用了k個

struct node;

node num[maxn];

#define inf 1e6

int n = 0,m = 0;

void solve()

for(int i = num[1].mi;i <= num[1].ma;++i)

for(int i = 2;i<= n;++i)

dp[i][j+k][k] += dp[i-1][j][l];//由第i-1種轉移而來,所以要遍歷i-1種的情況 }}

} }int ans = 0;

for(int i = num[n].mi;i <= num[n].ma;++i)

printf("%d\n",ans);

}int main()

solve();

} return 0;

}

DP 動態規劃 揹包問題

將乙個容量為v的揹包,物品有兩個屬性,乙個w和乙個v表示體積和屬性值。每種物品只有乙個。要求裝下盡可能多,求最大價值。轉移狀態方程 dp j max dp dp j list i w list i v,dp j 1 include includeusing namespace std struct ...

動態規劃(DP)揹包問題

dp做題的步驟 1.確定狀態變數 dp i dp i j 的含義 2.確定狀態轉移方程 3.確定邊界條件 4.確定遞推順序 題目1 01揹包 有n個重量和價值分別為w和v的物品。從這些物品中挑選總重量不超過w的物品。求所有挑選方案中價值總和的最大值 思路 dp i 1 j 表示從前i個物品中選出總重...

DP動態規劃 揹包問題

具體例子 有n個重量和價值分別為wi,vi的物品,從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。例如 n 4 w,v w 5 dp思想 求出狀態轉移方程,也就是求出遞推式。首先將問題一般化 解決此問題需要2個一維陣列,和1個二維陣列 w i 表示第i個物品的重量,下標從0...