acwing 3 完全背包
習(xí)題地址?https://www.acwing.com/problem/content/description/3/
題目描述
有 N 種物品和一個(gè)容量是 V 的背包,每種物品都有無限件可用。
第 i 種物品的體積是 vi,價(jià)值是 wi。
求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價(jià)值最大。
輸出最大價(jià)值。
輸入格式
第一行兩個(gè)整數(shù),N,V,用空格隔開,分別表示物品種數(shù)和背包容積。
接下來有 N 行,每行兩個(gè)整數(shù) vi,wi,用空格隔開,分別表示第 i 種物品的體積和價(jià)值。
輸出格式
輸出一個(gè)整數(shù),表示最大價(jià)值。
數(shù)據(jù)范圍
0<N,V≤1000
0<vi,wi≤1000
樣例
輸入樣例 4 5 1 2 2 4 3 4 4 5 輸出樣例: 10算法1
幾乎與01背包的一維解答一模一樣,唯一的區(qū)別是v的遍歷次序是遞增的。
那么就是說明dp轉(zhuǎn)移方程
dp[j] = max(dp[j] , dp[j-v[i]]+w[i]);
dp依賴的狀態(tài)未必是i-1輪的狀態(tài) 而是同一輪中較小的j。 這也符合題意。
01背包中要驗(yàn)證當(dāng)前第i個(gè)物品是否拿還是不拿必須依賴上一輪(i-1)輪的狀態(tài),這個(gè)狀態(tài)是絕對不會(huì)出現(xiàn)已經(jīng)拿取了第i個(gè)物品的情況。
但是在完全背包中,由于物品有多個(gè),可能要驗(yàn)證當(dāng)前是否拿第i個(gè)物品所依賴的狀態(tài)已經(jīng)取過若干個(gè)第i個(gè)物品了
所以v的遍歷是由小到大遞增的。
C++ 代碼
1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int N= 1010; 7 8 int n,m; 9 10 int arr[N]; 11 int v[N]; 12 int w[N]; 13 14 int main() 15 { 16 cin >> n >> m; 17 18 for(int i = 1;i <= n;i++){ 19 cin >> v[i] >> w[i]; 20 } 21 22 for(int i = 1;i<=n;i++){ 23 for(int j = v[i];j <= m ;j++){ 24 arr[j] = max(arr[j] , arr[j-v[i]]+w[i]); 25 } 26 } 27 28 cout << arr[m]; 29 30 return 0; 31 } 32 33 作者:defddr 34 鏈接:https://www.acwing.com/solution/AcWing/content/2191/ 35 來源:AcWing 36 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/itdef/p/10911194.html
總結(jié)
以上是生活随笔為你收集整理的acwing 3 完全背包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具 docker
- 下一篇: v-charts显示标题