luogu1156_垃圾陷阱_dp背包
类似背包的dp题
题面
https://www.luogu.org/problemnew/show/P1156
solution
- f[i] 表示高度为i的最大生命值
- 一个物品可以用来吃或者跳得更高,所以f[i]可以转移到f[i+hight]和f[i]+life
code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
inline int read(){
char ch=' ';int f=1;int x=0;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
struct node
{
int t,h,l;
}r[110];
bool cmp(node a,node b)
{
return a.t<b.t;
}
int f[110];
int main()
{
int d,n;
d=read();n=read();
int i,j;
for(i=1;i<=n;i++) r[i].t=read(),r[i].l=read(),r[i].h=read();
sort(r+1,r+1+n,cmp);
f[0]=10;
for(i=1;i<=n;i++)
{
for(j=d;j>=0;j--)
{
if(f[j]>=r[i].t)
{
if(j+r[i].h>=d)
{
cout<<r[i].t<<endl;
return 0;
}
f[j+r[i].h]=max(f[j+r[i].h],f[j]);
f[j]+=r[i].l;
}
}
}
cout<<f[0]<<endl;
return 0;
}