这是一道很好的题目

对于这道题目,我们首先明确的状态:

表示当扔下第个垃圾时,高度为此时的还可以存活多久

对于转移,我们要分两种情况:

当不选用这个垃圾来当垫子时:

当选用这个垃圾来当垫子时

表示垃圾可以垫高的高度

表示吃垃圾可以维持的生命多少

对于爬不出的情况:

初始化:

#include <bits/stdc++.h>
using namespace std;
const int N=1e2+5,Inf=1e12;
struct rubbish {
    int t,f,h;
} num[N];
inline bool cmp(rubbish x,rubbish y) {
    return x.t<y.t;
}
int d,n,res=-Inf,ans,f[N][N];
inline int read() {
    int x=0,f=1;char ch=getchar();
    while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
int main() {
    d=read(),n=read(); 
    f[0][0]=10;
    for ( register int i=1;i<=n;i++ ) 
        num[i].t=read(),num[i].f=read(),num[i].h=read();
    sort(num+1,num+n+1,cmp);
    for ( register int i=0;i<n;i++ )
        for ( register int j=0;j<=d;j++ ) {
            if(f[i][j]>=num[i+1].t) { 
                int sm=j+num[i+1].h;
                if(sm>=d) {
                    printf("%d\n",num[i+1].t);
                    return 0;
                }
                f[i+1][j]=max(f[i+1][j],f[i][j]+num[i+1].f);
                f[i+1][sm]=max(f[i+1][sm],f[i][j]);
            }
        }
    for ( register int i=1;i<=n;i++ ) res=max(res,f[i][0]);
    printf("%d",res);
    return 0;
}