codeforces 864E Fire (排序+背包dp)
2017-09-26 16:13
441 查看
题目大意:
现在你有n个物品,每个物品三个属性,我个人记为a,b,c.
a表示你需要花a的时间去救这个物品,b表示到b时间后物品就销毁了,c表示救这个物品的价值,求出能救到的最大价值。
n <= 100 b <= 2000 c <= 20 a <= 20
排序后dp,要先救活时间短的,所以就是从小到大排序
现在你有n个物品,每个物品三个属性,我个人记为a,b,c.
a表示你需要花a的时间去救这个物品,b表示到b时间后物品就销毁了,c表示救这个物品的价值,求出能救到的最大价值。
n <= 100 b <= 2000 c <= 20 a <= 20
排序后dp,要先救活时间短的,所以就是从小到大排序
#include <bits/stdc++.h> using namespace std; struct node { int t,d,p,id; }s[110]; int dp[2010]; vector<int> v[2010]; int cmp(node a,node b) { return a.d<b.d; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&s[i].t,&s[i].d,&s[i].p),s[i].id=i; } sort(s+1,s+n+1,cmp); for(int i=1;i<=n;i++) { if(s[i].d-s[i].t<=0) continue; for(int j=s[i].d-1;j-s[i].t>=0;j--) { if(dp[j]<dp[j-s[i].t]+s[i].p) { dp[j]=dp[j-s[i].t]+s[i].p; v[j]=v[j-s[i].t]; v[j].push_back(s[i].id); } } } int best=0,bestI=0; for(int i=0;i<=2000;i++) { if(dp[i]>best) { best=dp[i]; bestI=i; } } printf("%d\n",best ); printf("%d\n",v[bestI].size() ); for(int i=0;i<v[bestI].size();i++) printf("%d ",v[bestI][i] ); }
相关文章推荐
- Codeforces 864E Fire【排序+背包dp】
- Codeforces 864E Fire(背包DP)
- codeforces 19B - Checkout Assistant DP 背包
- [Codeforces 543A] Writing Code (完全背包DP)
- codeforces 283C Coin Troubles(背包DP)
- Codeforces 864E Fire (DP)
- CodeForces - 808E-K - Selling Souvenirs-DP(像背包但不是背包)+优化技巧
- codeforces 148E Porcelain(DP, 分组背包)
- Codeforces 148E Porcelain [预处理+dp背包]
- codeforces 543A Writing Code(dp降维优化,完全背包思想)
- codeforces 13C Sequence(排序,DP)
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
- [杂题 背包DP] Codeforces 793E Tinkoff Challenge - Elimination Round E. Problem of offices
- codeforces 148E Aragorn's Story 背包DP
- codeforces 167B Wizards and Huge Prize (概率dp,类似背包)
- 洛谷 1654 产品排序(sort) 背包DP+贪心
- Codeforces 443D Andrey and Problem【排序+概率dp】
- codeforces 577B B. Modulo Sum(背包+dp)
- 两道需要排序的dp背包下问题 -- hdu 2546 饭卡/ hdu 3466 Proud Merchants
- [Codeforces 232B] Table (计数 + 背包DP)