【题解】luogu p1156 垃圾陷阱

背包

总结:

1.状态要根据问的问题设计,一开始我设计dp[i]是在i时间时的最高高度,而题目卡门最长可以活多久,这样设计的话若不能出去,则这个不好判断。所以设计为dp[i]是在i的高度时,卡门最多可以后活多久,这样问题便迎刃而解。

2.不用将牛的寿命减去时间,直接将牛可以存活的时间与当前时间比较即可。

3.关于状态设计时,  dp[j+a[i].h] = max(dp[j+a[i].h], dp[j]);这个是选择堆积时,我们这时候直接选择最大的寿命即可
            dp[j] += a[i].f; 这个是选则吃垃圾时的最大寿命。

 

#include<bits/stdc++.h>
using namespace std;
struct node{
    int t, f, h;
}a[105];
int d, g, dp[105];

bool cmp(node x, node y)
{
    return x.t < y.t;
}

int main()
{
    cin >> d >> g;
    for(int i = 1; i <= g; i++)
        cin >> a[i].t >> a[i].f >> a[i].h;
    sort(a+1, a+1+g, cmp);
    memset(dp, -0x3f, sizeof(dp));
    dp[0] = 10;
    for(int i = 1; i <= g; i++)
        for(int j = d; j >= 0; j--)
            if(dp[j] >= a[i].t)
            {
                if(a[i].h+j >= d)
                {
                    cout << a[i].t;
                    return 0;
                }
                dp[j+a[i].h] = max(dp[j+a[i].h], dp[j]);
                dp[j] += a[i].f;
            }
    cout << dp[0];
    return 0;
    
    
} 

 

posted @ 2019-08-17 23:07  ATKevin  阅读(131)  评论(0编辑  收藏  举报