思虑
-
对能量石排序
-
排完序用 01 背包求解。
代码
#include <bits/stdc++.h>
using namespace std;
#define db double
#define ll long long
#define Pir pair<int, int>
#define fi first
#define se second
#define pb push_back
#define m_p make_pair
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
/*==========ACMer===========*/
const int N = 1e4 + 10;
struct Stone
{
int s, e, l;
bool operator < (const Stone & tmp) const
{
return s * tmp.l < tmp.s * l;
}
} stone[N];
int f[N];
int main()
{
int T, cas = 1; scanf("%d", &T);
while (T --)
{
int n, m = 0;
scanf("%d", &n);
int u, v, w;
for (int i = 1; i <= n; i ++) {
scanf("%d %d %d", &u, &v, &w);
stone[i] = Stone{ u, v, w };
m += u;
}
sort(stone + 1, stone + 1 + n);
memset(f, -inf, sizeof f);
f[0] = 0;
for (int i = 1; i <= n; i ++) {
for (int j = m; j >= stone[i].s; j --) {
if (stone[i].e - stone[i].l * (j - stone[i].s) > 0)
f[j] = max(f[j], f[j - stone[i].s] + stone[i].e - stone[i].l * (j - stone[i].s));
}
}
int ans = 0;
for (int i = 1; i <= m; i ++) ans = max(ans, f[i]);
printf("Case #%d: %d\n", cas ++, ans);
}
return 0;
}