#include <bits/stdc++.h>
using namespace std;
const int N = 5000 + 10;
int n;
struct node
{
int t, d, p;
}tr[N];
int f[N]; //前i个工作在j时刻完成得到的最大报酬
//基于01背包的特性,对于每一个工作组合,可以不从零时刻开始,但是一旦开始就必须连续进行直到j时刻
//排序之后,如果选择了第i个工作,由于其截止时间不比前面的早,将该工作放在最后一个完成才能获得最大报酬
bool cmp(node a, node b)
{
return a.d < b.d;
}
void solve()
{
cin >> n;
for(int i = 1; i <= n; i ++ )
{
cin >> tr[i].t >> tr[i].d >> tr[i].p;
}
sort(tr + 1, tr + 1 + n, cmp);
memset(f, 0, sizeof f);
for(int i = 1; i <= n; i ++ )
{
for(int j = tr[i].d; j >= tr[i].t; j -- )
{
f[j] = max(f[j], f[j - tr[i].t] + tr[i].p);
}
}
int ans = 0;
for(int i = 1; i <= tr[n].d; i ++ )
ans = max(ans, f[i]);
cout << ans << endl;
}
int main()
{
int t;
cin >> t;
while(t --)
{
solve();
}
return 0;
}

被折叠的 条评论
为什么被折叠?



