您的位置:首页 > 其它

垃圾陷阱 洛谷1156 dp

2017-01-22 19:08 337 查看

题目描述

卡门――农夫约翰极其珍视的一条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<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: