您的位置:首页 > 其它

CodeForces - 864E Fire 背包+记录路径

2017-10-03 19:33 405 查看
整理一下

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 7;
int n, max_;
int ans[20*maxn];
int path[maxn][20*maxn];
struct node {
int t, d, v, id;
} a[maxn];
bool cmp(node a, node b) {
return a.d < b.d;
}

void init() {
cin >> n;
for(int i = 0; i < n; ++i) {
cin >> a[i].t >> a[i].d >> a[i].v;
a[i].id = i + 1;
max_ = max(max_, a[i].d);
}
sort(a, a+n, cmp);
}

void solve() {
memset(ans, 0, sizeof ans);
memset(path, 0, sizeof path);
for(int i = 0; i < n; ++i) {
for(int j = a[i].d; j > a[i].t; --j) {
if(ans[j-a[i].t]+a[i].v > ans[j]) {
ans[j] = ans[j-a[i].t]+a[i].v;
path[i][j] = 1;
}
}
}
int maxx = 0, id = 0;
for(int j = 0; j <= max_; ++j)
if(ans[j] > maxx) {
maxx = ans[j];
id = j;
}
cout << maxx << endl;
stack<int> sk;
int cnt = 0;
int i = n-1, j = id;
while(i >= 0 && j >= 0) {
if(path[i][j] == 1) {
sk.push(a[i].id);
cnt++;
j -= a[i].t;
}
i--;
}
cout << cnt << endl;
while(!sk.empty()) {
cout << sk.top();
sk.pop();
if(sk.empty()) cout << endl;
else cout << " ";
}
}
int main() {
ios::sync_with_stdio(0);
init();
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: