第一眼是贪心排序之后做一遍背包,然后发现自己不知道怎么排序。
贪心策略应该是从上往下确定放什么箱子,所以优先放承受尽量少的箱子。
若 $i$ 需要在 $j$ 之前考虑,需要满足 $s_i - w_j \lt s_j - w_i$,移项得 $s_i + w_i \lt s_j + w_j$。
按照这个规则排序,然后做背包。
#include <bits/stdc++.h>
using namespace std;
const int N = 1015, M = 2e4 + 15;
int n;
long long dp[M];
struct Conan {
int w, s, v;
} a[N];
bool cmp(Conan a, Conan b) {
return a.w + a.s < b.w + b.s;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d%d", &a[i].w, &a[i].s, &a[i].v);
sort(a + 1, a + 1 + n, cmp);
memset(dp, -0x3f, sizeof dp); dp[0] = 0;
for (int i = 1; i <= n; i++)
for (int j = a[i].w + a[i].s; j >= a[i].w; j--) dp[j] = max(dp[j], dp[j - a[i].w] + a[i].v);
long long ans = 0;
for (int i = 0; i <= 20000; i++) ans = max(ans, dp[i]);
printf("%lld\n", ans);
return 0;
}