RT,感觉思路没啥问题啊
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n,f[2005],cnt[2005],ans[2005][105],out;
struct Fire{
int t,d,p,x;
}a[105];
bool cmp(Fire a,Fire b){
return a.d<a.d;
}
int main(){
n=read();
for(int i=1;i<=n;i++)a[i].t=read(),a[i].d=read(),a[i].p=read(),a[i].x=i;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
for(int j=a[i].d-1;j>=a[i].t;j--)
if(f[j]<f[j-a[i].t]+a[i].p){
f[j]=f[j-a[i].t]+a[i].p;
cnt[j]=cnt[j-a[i].t];
for(int k=1;k<=cnt[j];k++)
ans[j][k]=ans[j-a[i].t][k];
ans[j][++cnt[j]]=a[i].x;
}
for(int i=0;i<=2000;i++)
if(f[out]<f[i])out=i;
//printf("%d\n",out);
printf("%d\n%d\n",f[out],cnt[out]);
for(int i=1;i<=cnt[out];i++)printf("%d ",ans[out][i]);
return 0;
}