acwing 3 完全背包
習題地址?https://www.acwing.com/problem/content/description/3/
題目描述
有 N 種物品和一個容量是 V 的背包,每種物品都有無限件可用。
第 i 種物品的體積是 vi,價值是 wi。
求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行兩個整數,N,V,用空格隔開,分別表示物品種數和背包容積。
接下來有 N 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 i 種物品的體積和價值。
輸出格式
輸出一個整數,表示最大價值。
數據范圍
0<N,V≤1000
0<vi,wi≤1000
樣例
輸入樣例 4 5 1 2 2 4 3 4 4 5 輸出樣例: 10算法1
幾乎與01背包的一維解答一模一樣,唯一的區別是v的遍歷次序是遞增的。
那么就是說明dp轉移方程
dp[j] = max(dp[j] , dp[j-v[i]]+w[i]);
dp依賴的狀態未必是i-1輪的狀態 而是同一輪中較小的j。 這也符合題意。
01背包中要驗證當前第i個物品是否拿還是不拿必須依賴上一輪(i-1)輪的狀態,這個狀態是絕對不會出現已經拿取了第i個物品的情況。
但是在完全背包中,由于物品有多個,可能要驗證當前是否拿第i個物品所依賴的狀態已經取過若干個第i個物品了
所以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 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 View Code?
轉載于:https://www.cnblogs.com/itdef/p/10911194.html
總結
以上是生活随笔為你收集整理的acwing 3 完全背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具 docker
- 下一篇: v-charts显示标题