[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; }
小结:无。
| 欢迎来原网站坐坐! >原文链接<