垃圾陷阱 洛谷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; }
相关文章推荐
- 洛谷1156 垃圾陷阱 dp
- 洛谷1156 垃圾陷阱
- 洛谷1156 垃圾陷阱(背包动规)
- Luogu P1156 垃圾陷阱 【dp】By cellur925
- 洛谷1156 垃圾陷阱
- 洛谷1156 垃圾陷阱
- [luoguP1156] 垃圾陷阱(DP)
- 洛谷P1156 垃圾陷阱 背包DP
- [洛谷1156]垃圾陷阱
- 辣鸡陷阱_洛谷1156_dp
- 洛谷1156垃圾陷阱
- 【DP】洛谷 P1156 垃圾陷阱
- 洛谷P1156 垃圾陷阱(DP,0-1背包)
- [luogu1156]垃圾陷阱_动态规划_背包dp
- SSL1673 垃圾陷阱(dp)
- [DP]垃圾陷阱
- 洛谷 1156 dp
- 洛谷 1156 dp
- 洛谷 1156 dp
- 洛谷 P1156 垃圾陷阱