【luogu 1156】 垃圾陷阱 [动态规划 背包]

P1156 垃圾陷阱

蒟蒻哭辽QAQ  想了半个小时 明明嗅到了背包的气息 but emmmmm 状态想偏了QAQ

 设dp[i][j]表示前i个垃圾(注意一定要先按垃圾出现时间排序好),到达高度j时所拥有的最长的生命时间。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define rg register
 5 const int D=100+5,F=30,T=1000+5,inf=0x3f3f3f3f;
 6 int d,n,f[D][D];
 7 template <class t>void rd(t &x)
 8 {
 9     x=0;int w=0;char ch=0;
10     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
11     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
12     x=w?-x:x;
13 }
14 
15 struct litter{int t,h,l;}a[D];
16 bool cmp(const litter &x,const litter &y) {return x.t<y.t;}
17 
18 int main()
19 {
20     //freopen("nocows.in","r",stdin);
21     //freopen("nocows.out","w",stdout);
22     rd(d),rd(n);
23     for(rg int i=1;i<=n;++i) rd(a[i].t),rd(a[i].l),rd(a[i].h);
24     sort(a+1,a+1+n,cmp);
25     f[0][0]=10;
26     for(rg int i=1;i<=n;++i)
27     for(rg int j=0;j<=d;++j)
28     {
29         if(f[i-1][j]>=a[i].t) f[i][j]=max(f[i][j],f[i-1][j]+a[i].l);
30         if(j>=a[i].h&&f[i-1][j-a[i].h]>=a[i].t) f[i][j]=max(f[i][j],f[i-1][j-a[i].h]);
31      }
32      int ans=0,res=0;
33      for(rg int i=1;i<=n;++i)
34      for(rg int j=0;j<=d;++j)
35      {
36          if(f[i][j]>=a[i].t) ans=max(ans,j);
37          res=max(res,f[i][j]);
38          if(ans>=d) {printf("%d",a[i].t);exit(0);}
39      }
40      printf("%d",res);
41     return 0;
42 }

 

posted @ 2019-05-08 22:10  委屈的咸鱼鱼鱼鱼  阅读(146)  评论(0编辑  收藏  举报