揹包問題(揹包九講) 學習筆記

2021-09-26 09:21:10 字數 1643 閱讀 5158

學習了dd大佬的揹包九講之後,

個人的一些學習筆記以及一些看法。

/*

dp[i][j] 表示前i個物品,容量為j的時候,最大的價值

思路:將前i件物品放入容量為v的揹包中求最大價值這個問題,若只考慮第i件物品的策略(放或不放),

那麼問題就可以轉換成涉及前i-1的物品的問題。

此時有兩種情況,

1、不放第i件物品,那麼問題就轉換為前i-1件物品放入容量為j的揹包中,價值為dp[i-1][j];

2、放入第i件物品,那麼問題就轉換為前i-1件物品放入容量為(j-(第i件物品的重量v[i]))的揹包中,價值為dp[i-1][j-v[i]]+w[i]

選擇這兩種情況中價值最大的一種,就是當前前i個物品,容量為j的時候,最大的價值。

狀態轉移方程:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])

*/#include #include #include using namespace std;

vector_v(1010,0);

vector_w(1010,0);

vector> dp(1010, vector(1010, 0));

int main()

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

else

dp[i][j] = dp[i - 1][j];

} }cout << dp[n][v];

return 0;

}

空間複雜度進行優化:

優化之前,dp是乙個二維陣列

因為每次迴圈,都是線性走一遍二維陣列中的第i-1個一維陣列,

與其他維度的陣列無關,所以可以考慮將dp設定為一維陣列

同時,陣列的遍歷修改應該反轉一下,從後往前,這樣可以保證在不影響前面元素的情況下,用 i 輪的資料覆蓋 i-1 輪的資料 for(int j=v;i>0;–j)

/*

dp[i][j] 表示前i個物品,容量為j的時候,最大的價值

思路:將前i件物品放入容量為v的揹包中求最大價值這個問題,若只考慮第i件物品的策略(放或不放),

那麼問題就可以轉換成涉及前i-1的物品的問題。

此時有兩種情況,

1、不放第i件物品,那麼問題就轉換為前i-1件物品放入容量為j的揹包中,價值為dp[i-1][j];

2、放入第i件物品,那麼問題就轉換為前i-1件物品放入容量為(j-(第i件物品的重量v[i]))的揹包中,價值為dp[i-1][j-v[i]]+w[i]

選擇這兩種情況中價值最大的一種,就是當前前i個物品,容量為j的時候,最大的價值。

狀態轉移方程:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])

*/#include #include #include using namespace std;

vector_v(1010,0);

vector_w(1010,0);

vectordp(1010,0);

int main()

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

}} cout << dp[v];

return 0;

}

揹包九講學習筆記(2)

寫在前面 一方面學習揹包九講 這個十分清晰,重點標記清楚。但有些需要自己理解的和重點的,我做了如下筆記,方便別人理解,也方便自己複習,如有錯誤,歡迎指正。題目特點1.n種物品v容量,每種物品費用c i 價值w i 2.每種物品無限件 3.要求 費用和不超過揹包容量且價值總和最小簡單思路 基本思路 從...

揹包九講 學習筆記(一)

本文是針對揹包九講2.0的學習筆記。給定n個物體和乙個揹包,物品i的重量是wi,價值vi,揹包容量為c,物品只能選擇不裝或裝入揹包,問如何選擇裝入揹包的物品,使裝入揹包中的物品的總價值最大?輸入 c 0,wi 0,vi 0,1 i n 輸出 x 1,x2,xn x i in 滿足 sum w i x...

《揹包9講》學習

0 1揹包 題目描述見 beibao 01揹包.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std const int nn 1010 int v nn w nn int f nn nn int main fo...