題目大意
給定 n 個物品的空間 ai 和價值 bi,問總空間不超過 100 的情況下可以湊出的最高價值為多少?
題解
本題是經典的 01 背包問題,可以透過動態規劃 (Dynamic Programming) 解決。我們定義 dp[i][j] 為前 i 個物品使用 j 空間可以湊出的最高價值。可以發現 dp[i] 的轉移都會從 dp[i−1] 來,因此可以用滾動式 dp 解決。又因為使用 j 的空間的最高價值也要跟 j−1 的取 max,因此我們可以反過來做,這樣就只需要一個陣列,不需要滾動。實作的細節請參考 code。
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
while(cin >> n) {
vector<int> a(n), b(n);
for(int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
vector<int> dp(101);
for(int i = 0; i < n; i++) {
for(int j = 100; j >= a[i]; j--) {
dp[j] = max(dp[j], dp[j - a[i]] + b[i]);
}
}
cout << dp[100] << "\n";
}
return 0;
}
如果本文對您有幫助的話幫忙點擊廣告和分享吧!
© 若無特別註明,本站文章皆由 WeakMouse's Coding Blog 原創 ,轉載引用本文前請先留言告知。本文轉載請註明文章源自 WeakMouse's Coding Blog ,作者 ,並附上原文連結: 【題解】Zerojudge b184 - 5. 裝貨櫃問題
0 留言