垃圾陷阱 洛谷1156 dp

题目描述

卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中。“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺。

卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。

每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。

假设卡门预先知道了每个垃圾扔下的时间t(0< t<=1000),以及每个垃圾堆放的高度h(1<=h<=25)和吃进该垃圾能维持生命的时间f(1<=f<=30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续10小时的能量,如果卡门10小时内没有进食,卡门就将饿死。

分析

谢谢老伙计提供的水题~~

dp[i]表示堆了i的高度能活多久

1.堆起来的话就是dp[i+h]=max(dp[i+h],dp[i])

2.吃掉dp[i]=dp[i]+f

初值dp[0]=10,若出不去就输出dp[0]了

ps:以时间为关键字把数据排序。

偷懒中233

code

#include
#include
#include
#include
#include
#include

using namespace std;

int dp[10000];
struct arr{
    int x,y,w;
}a[10000];

int n,m;

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a[i].w,&a[i].x,&a[i].y);
    }
    for (int i=1;i<=m-1;i++)
        for (int j=i+1;j<=m;j++)
            if (a[i].w>a[j].w)
            {
                arr k;
                k=a[i];
                a[i]=a[j];
                a[j]=k;
            } 
    dp[0]=10;
    for (int i=1;i<=m;i++)
    {
        for (int j=n;j>=0;j--)
        {
            if (dp[j]>=a[i].w)
            {
                if (j+a[i].y>=n)
                {
                    printf("%d",a[i].w);
                    return 0; 
                }  
                dp[j+a[i].y]=max(dp[j+a[i].y],dp[j]);
                dp[j]=dp[j]+a[i].x;
            } 
        }
    }
    printf("%d",dp[0]);
    return 0;
} 

你可能感兴趣的:(动态规划,c++)