1 #include<stdio.h>
2 #include<algorithm>
3 #define max(a,b) a>b?a:b
4 using namespace std;
5 /*
6 初始值生命值,
7 即dp[0]为10,
8 dp[i]表示当高度为i时最大的生命值
9 */
10 int d,g,dp[110]={10};
11 struct data{int t,f,h;}s[110];
12 bool cmp(data a,data b)
13 {
14 return a.t<b.t;
15 }
16 int main()
17 {
18 scanf("%d%d",&d,&g);
19 for(int i=1;i<=g;++i)
20 scanf("%d%d%d",&s[i].t,&s[i].f,&s[i].h);
21 //按时间排序(STL美滋滋)
22 sort(s+1,s+1+g,cmp);
23 //枚举掉落的垃圾
24 for(int i=1;i<=g;++i)
25 {
26 //枚举高度
27 for(int j=d;j>=0;--j)
28 {
29 if(dp[j]>=s[i].t)
30 {
31 //如果当前高度+当前垃圾的高度 ≥井的高度则直接输出当前时间
32 if(j+s[i].h>=d)
33 {
34 printf("%d",s[i].t);
35 return 0;
36 }
37 //使高度为j+s[i].h时的生命值最大
38 dp[j+s[i].h]=max(dp[j],dp[j+s[i].h]);
39 //吃垃圾,即更新dp[j]的最大生命值
40 dp[j]+=s[i].f;
41 }
42 }
43 }
44 //如果没有出去输出他活了多长时间
45 printf("%d",dp[0]);
46 }