[luogu1156]垃圾陷阱_动态规划_背包dp

垃圾陷阱 luogu-1156

    题目大意:Holsteins在距离地面D英尺的地方,FJ间隔时间ti会往下扔第i个垃圾。Holsteins对待每一个垃圾都会选择吃掉或者垫高。Holsteins有10个点儿的生命值,每个垃圾会给她提供f的生命值。每小时Holsteins会消耗一定的生命值。问:Holsteins最早可以什么时候爬出;否则输出Holsteins可以存活多长时间。

    注释:$2\le D\le 100$,$0 < t \le 1000$,$1\le h \le 25$,$1\le f \le 30$。

      想法:背包dp,和普通的背包不同的是如果这个物品不选,那么它会对Holsteins的生命值产生影响,稍微判断即可。

    最后,附上丑陋的代码... ...

// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 110 
using namespace std;
struct Node
{
	int t,h,l;
}f[N];
int n,m;
int ti[N];
int dp[N];
inline bool cmp(Node a,Node b)
{
	return a.t<b.t;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&f[i].t,&f[i].l,&f[i].h);
	}
	sort(f+1,f+m+1,cmp);
	dp[0]=10;
	for(int i=1;i<=m;i++)
	{
		for(int j=n;j>=0;j--)
		{
			if(dp[j]>=f[i].t)
			{
				if(j+f[i].h>=n)
				{
					cout<<f[i].t;
					return 0;
				}
				dp[j+f[i].h]=max(dp[j+f[i].h],dp[j]);
				dp[j]+=f[i].l;
			}
		}
	}
	printf("%d\n",dp[0]);
	return 0;
}

 

    小结:无。

 

posted @ 2018-05-11 08:40  JZYshuraK_彧  阅读(218)  评论(0编辑  收藏  举报