歡迎訪問我的pat頂級題解目錄哦
題目描述
算法設計
這是一道0-1揹包問題。設、、分別表示第個任務的收益、持續時間、截止日期,表示在第個任務中,任選一些能夠在天內完成的任務,所得到的最大收益。假設下標從1開始。我們首先按截止日期從小到達對這些任務進行排序。我們要注意,如果在第天要完成第個任務,那麼這個任務的最晚開始時間應該是,顯然當時,這個任務不可能在第天完成。那麼我們可以得到狀態轉移方程:
C++代碼
#include <bits/stdc++.h>
using namespace std;
struct Pro {
int p, l, d;
};
int main() {
int n;
cin >> n;
vector<Pro> pros(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> pros[i].p >> pros[i].l >> pros[i].d;
t = max(t, pros[i].d);
}
sort(pros.begin(), pros.end(), [](const Pro& p1, const Pro& p2) {
return p1.d < p2.d;
});
int t = pros.back().d;
vector<vector<int>> dp(n + 1, vector<int>(t + 1));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= t; ++j) {
dp[i][j] = dp[i - 1][j];
int k = min(j, pros[i].d) - pros[i].l;
if (k >= 0)
dp[i][j] = max(dp[i][j], dp[i - 1][k] + pros[i].p);
}
}
cout << dp[n][t];
return 0;
}