这是一道很好的
题目
对于这道题目,我们首先明确
的状态:
表示当扔下第
个垃圾时,高度为
此时的还可以存活多久
对于转移,我们要分两种情况:
当不选用这个垃圾来当垫子时:
&preview=true)
当选用这个垃圾来当垫子时
&preview=true)
表示垃圾可以垫高的高度
表示吃垃圾可以维持的生命多少
对于爬不出的情况:
%20(1%3C%3Di%3C%3Dn)%20&preview=true)
初始化:

#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;
}