【01背包 && 记录路径 && 约束】Codeforces Round #436 (Div. 2) E. Fire
2017-12-22 20:53
387 查看
Problem Description
发生火灾了,家里有n件物品,每件物品有把它就救出来的时间,烧坏的所需时间,没烧坏的价值。
问你你拯救的最大价值,同时输出拯救的物品数量,和物品。
思路:
达到烧坏所需的时间后,这个物品就没有价值了。约束条件就是烧坏所需时间还有一个点就是如何记录路径,我们用一个vector s[]。记录当前dp[i]所拯救的物品。dp[i]代表i时间,拯救的最大价值。
发生火灾了,家里有n件物品,每件物品有把它就救出来的时间,烧坏的所需时间,没烧坏的价值。
问你你拯救的最大价值,同时输出拯救的物品数量,和物品。
思路:
达到烧坏所需的时间后,这个物品就没有价值了。约束条件就是烧坏所需时间还有一个点就是如何记录路径,我们用一个vector s[]。记录当前dp[i]所拯救的物品。dp[i]代表i时间,拯救的最大价值。
#include<bits/stdc++.h> using namespace std; struct node { int t, d, p, id; bool operator < (const node &b) const { return d < b.d; } }; node a[150]; int dp[2005]; vector<int> s[2005]; int main() { int n, i, j; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d %d %d", &a[i].t, &a[i].d, &a[i].p), a[i].id = i+1; sort(a, a + n);//按d从小到大排序,我们得优先考虑最快被烧坏的物品 for(i = 0; i < n; i++) { for(j = a[i].d-1; j >= a[i].t; j--)//j从a[i].d-1开始 { if(dp[j] < dp[j-a[i].t] + a[i].p) { dp[j] = dp[j-a[i].t] + a[i].p;//更新dp[j] s[j] = s[j-a[i].t];//由s[j-a[i].t]过来,所以它所拯救的得copy过来 s[j].push_back(a[i].id);//当前dp[j]对应的所拯救的物品 } } } int ans = -1, ans1; for(i = 0; i <= 2000; i++) { if(dp[i] > ans){ ans = dp[i]; ans1 = i; } } printf("%d\n%d\n", ans, s[ans1].size()); for(i = 0; i < s[ans1].size(); i++) { if(i) printf(" "); printf("%d", s[ans1][i]); } printf("\n"); return 0; }
相关文章推荐
- Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)
- POJ 2965 The Pilots Brothers' refrigerator(dfs+记录路径)
- hdu 1385 Minimum Transport Cost(floyd && 记录路径)
- ZOJ 3703 Happy Programming Contest 01背包+记录路径
- UVA - 624 (01背包,记录路径)
- POJ1787:Charlie's Change(记录路径的多重背包)
- zoj 2156 Charlie's Change(多重背包+倍增优化+记录路径)
- hdu1529 Cashier Employment--单源最短路径&差分约束
- HDU NO.1160 FatMouse's Speed(“最长上升子序列”,记录路径)
- 新年趣事之打牌(01背包+记录路径)
- CD - UVa 624 01背包记录路径
- Codeforces Round #436 (Div. 2) E. Fire(01背包+输出路径)
- Coderfroces 864 E. Fire(01背包+路径标记)
- HDU 1026 Ignatius and the Princess I && BFS+记录路径
- UVA 624 CD (01背包+打印路径 或 dfs+记录路径)
- hdu2126Buy the souvenirs (01背包+记录路径的种数)
- hdu1160 FatMouse's Speed--DP&记录路径
- HDU 6083 度度熊的午饭时光(01背包+记录路径)
- uva 01背包记录路径
- HDU 1160 FatMouse's Speed (最长上升子序列+记录路径)