luogu1156_垃圾陷阱_dp揹包
阿新 • • 發佈:2018-12-19
類似揹包的dp題
題面
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; }