洛谷P1156 垃圾陷阱 背包DP

题目大意:一头牛被困在一个初始为空的垃圾坑里,之后会扔下一些垃圾。每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费时间。这头牛开始时有足够持续10小时的能量,给定一些垃圾扔下的时间、高度与吃掉能提供的能量,输出最早什么时候可以爬出;否则输出最长存活时间。

对于一个垃圾有两种选择:吃掉或堆积。可以想到是类似背包问题。吃掉垃圾能延长存活时间,堆积垃圾可以增加高度,而答案输出的是达到一定高度的时间,所以设计出状态f[i]代表达到高度i的能量最大值(即达到高度i最长能活多久),则有状态转移方程f[i+a[j].h]=max(f[i+a[j].h],f[i]),即用当前高度的能量更新堆放这个垃圾之后所处高度的能量。
需要注意的是,应先按照垃圾扔下的时间给垃圾排序,如果到达这个高度的能量小于垃圾扔下的时间就要跳过对于这个垃圾的处理。

#include 
#include 
#define max(a,b) (a>b?a:b)
using namespace std;
struct garbage{
    int e,h,t;//energy,height,time
    bool operator < (const garbage &x) const{return x.t>t;}
}a[110];
int m,n,f[3000];
int main(){
    f[0]=10;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].t,&a[i].e,&a[i].h);
    sort(a+1,a+1+n);
    for(int j=1;j<=n;j++)
        for(int i=m;i>=0;i--){
            if(a[j].t>f[i]) continue;
            if(i+a[j].h>=m) {
                printf("%d\n",a[j].t);
                return 0;
            }
            f[i+a[j].h]=max(f[i+a[j].h],f[i]);
            f[i]+=a[j].e;
        }
    printf("%d\n",f[0]);
    return 0;
}

你可能感兴趣的:(DP)