AtCoder Education DP Contest X Tower 题解
题目链接
题目大意:有
数据范围:
感觉这题难点在于怎么证明贪心策略?
一眼知道用 exchange arguments,考虑怎么贪心。
如果先把
下面按
/**
* author: Jerry_Jiang
**/
#include <bits/stdc++.h>
#define LOCAL
using namespace std;
const int N = 1e3 + 5, W = 2e4 + 5;
int n;
long long dp[N][W];
struct block {
int w, s;
long long v;
bool operator < (const block &x) const {
return w + s < x.w + x.s;
}
} a[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i].w >> a[i].s >> a[i].v;
}
sort(a + 1, a + n + 1);
memset(dp, -0x3f, sizeof(dp));
dp[0][0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 0; j < W; j++) {
dp[i][j] = dp[i - 1][j];
if(j >= a[i].w && j - a[i].w <= a[i].s) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i].w] + a[i].v);
}
}
}
cout << *max_element(dp[n], dp[n] + W) << '\n';
return 0;
}