题目链接:​​http://codeforces.com/contest/864/problem/E​​​
题意:现在一个房子里着火了,你要从这个房子里抢救一些东西出来,有n件物品,抢救第i件物品,需要花费ti的时间,这件物品价值为pi,如果物品超过di的时间还没有被救出来,就救不了,现在问你最大能救出的价值为多少,并且输出救了的物品的id
解析:其实跟背包一样的,dp[j]表示j时刻救了多少价值的物品,每次更新dp的时候,更新一下vector(存物品id)

#include <bits/stdc++.h>
using namespace std;
struct node
{
int t,d,p,id;
bool operator < (const node &b)const
{
return d<b.d;
}
}a[105];
int dp[2005];
vector<int>ans[2005];
int main(void)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&a[i].t,&a[i].d,&a[i].p);
a[i].id = i;
}
sort(a+1,a+n+1);
dp[0] = 0;
for(int i=1;i<=n;i++)
{
for(int j=a[i].d-1;j>=a[i].t;j--)
{
if(dp[j]<dp[j-a[i].t]+a[i].p)
{
dp[j] = dp[j-a[i].t]+a[i].p;
ans[j].clear();
ans[j] = ans[j-a[i].t];
ans[j].push_back(a[i].id);
}
}
}
int maxx = 0,ansi;
for(int i=0;i<2005;i++)
{
if(maxx<dp[i])
{
maxx = dp[i];
ansi = i;
}
}
printf("%d\n",maxx);
printf("%d\n",ans[ansi].size());
for(int i=0;i<(int)ans[ansi].size();i++)
{
if(i)printf(" ");
printf("%d",ans[ansi][i]);
}
puts("");
return 0;
}