Codeforces Round #436 E. Fire(背包dp+输出路径)
题意:失火了,有n个物品,每个物品有价值pi,必须在时间di前(小于di)被救,否则就要被烧毁。救某个物
品需要时间ti,问最多救回多少价值的物品,并输出救物品的顺序。
3
3 7 4
2 6 5
3 7 6
11
2
2 3
2
5 6 1
3 3 5
1
1
1 思路:有点像一个背包,dp数组记录的是当前时间所能获得的最大价值,转移方程dp[j]=max(dp[j],dp[j-t[i].ti]+t[i].w)
path[i][j]表示到i号物品j时间的状态时救的物品编号(这里是从0开始)
emmmmm 具体的在代码中加以注释。 代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=2010;
struct node{
int ti,en,w,op;
}t[110];
int dp[maxn],path[110][maxn],a[110]; bool cmp(node x,node y){
if(x.en!=y.en)return x.en<y.en;
else return x.ti<y.ti;
} int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>t[i].ti>>t[i].en>>t[i].w;
t[i].op=i+1;
//op为每个物品的标号,题目要求从1开始
}
memset(dp,0,sizeof(dp));
memset(path,-1,sizeof(path));//开始全部置为-1
sort(t,t+n,cmp);
int ma=0;
for(int i=0;i<n;i++){
ma=max(ma,t[i].en);
if(i!=0){
for(int j=0;j<t[i].ti;j++)path[i][j]=path[i-1][j];
//时间小于所需的营救时间,那么就不救,等于上一状态
}
for(int j=t[i].en-1;j>=t[i].ti;j--){
if(dp[j]<dp[j-t[i].ti]+t[i].w){
dp[j]=dp[j-t[i].ti]+t[i].w;
path[i][j]=i;
//如果救,那么就更新dp数组以及path数组为该物品
}
else if(i>0){
path[i][j]=path[i-1][j];
//如果不救,那么还是等于上一状态
}
}
}
int sum=0,temp=0;
for(int i=0;i<=ma;i++){
if(dp[i]>sum){
sum=dp[i];
temp=i;
//取出最大价值以及在最大价值的情况下,救完最后一个物品的时间
}
}
int k=n-1,c=0;
while(temp>0){
a[c++]=t[path[k][temp]].op;
temp-=t[path[k][temp]].ti;
k--;
k=path[k][temp];
//反着记录下路径
}
cout<<sum<<endl<<c<<endl;
for(int i=c-1;i>=0;i--){
if(i!=c-1)cout<<' ';
cout<<a[i];
//倒叙输出
}
cout<<endl;
return 0;
}
Codeforces Round #436 E. Fire(背包dp+输出路径)的更多相关文章
- Codeforces Round #436 (Div. 2)【A、B、C、D、E】
Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- Codeforces 730J:Bottles(背包dp)
http://codeforces.com/problemset/problem/730/J 题意:有n个瓶子,每个瓶子有一个当前里面的水量,还有一个瓶子容量,问要把所有的当前水量放到尽量少的瓶子里至 ...
- Codeforces 922 E Birds (背包dp)被define坑了的一题
网页链接:点击打开链接 Apart from plush toys, Imp is a huge fan of little yellow birds! To summon birds, Imp ne ...
- 机器分配——线性dp输出路径
题目描述 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15 ...
- POJ-1015(背包变形+输出路径)
Jury Compromise POJ-1015 推荐几个较好的介绍和理解:https://blog.csdn.net/lyy289065406/article/details/6671105 htt ...
- Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)
E. Fire time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- Codeforces Round #436 (Div. 2) E. Fire(背包+记录路径)
传送门 题意 给出n种物品,抢救第\(i\)种物品花费时间\(t_i\),价值\(p_i\),截止时间\(d_i\) 询问抢救的顺序及物品价值和最大值 分析 按\(d_i\)排序的目的是防止以下情况 ...
- Codeforces Round #436 (Div. 2) E. Fire
http://codeforces.com/contest/864/problem/E 题意: 有一堆物品,每个物品有3个属性,需要的时间,失效的时间(一开始)和价值.只能一件一件的选择物品(即在选择 ...
随机推荐
- Laravel5 快速认证逻辑流程分析
Laravel5本身自带一套用户认证功能,只需在新项目下,使用命令行php artisan make:auth 和 php artisan migrate就可以使用自带的快速认证功能. 以下为分析登录 ...
- postgresql 游标,函数,存储过程使用例子
CREATE OR REPLACE FUNCTION cursor_demo() RETURNS refcursor AS --返回一个游标 $BODY$ declare --定义变量及游标 unbo ...
- Wpf开源收集
1,到底有哪些开源MVVM框架? 前面介绍了WPF的基本概念和一些相关知识,我们了解到开发WPF应用程序可以使用现成的框架和模式,最为合适的莫过于时下正热的MVVM模式,所以这里我们也列出针对MVVM ...
- win10 家庭版 升级 win10企业版
更改秘钥 我的电脑(右键)->属性-> 更改产品秘钥 -> 96YNV-9X4RP-2YYKB-RMQH4-6Q72D->重启系统 如果秘钥过期了,就百度按时间搜索,总有一个是 ...
- 关于git merge,rebase合并的差别,以及*(no branch)的处理。
1.merge 在上篇介绍分支的时候有简单的说了一下分支的创建和合并,当时合并就是写的merge,这是依据两个不同分支的最后一次提交的commit对象c5,c7和两个分支的交叉点的commit对象c3 ...
- SX_WIN10X64LTSB2016_EN_LITE英文精简版
SX_WIN10X64LTSB2016_EN_LITE英文精简版该版本为英文版!该版本为英文版!该版本为英文版!因为论坛巴基斯坦的maanu兄弟PM我,所以抽空做了一个.介绍沿用原来的,中文用谷歌翻译 ...
- 使用powerpoint的表对象
以下为basic范例,delphi使用需要加以修改 Table 对象 代表幻灯片上的表格形状.Table 对象是 Shapes 集合的成员.Table 对象包含 Columns 集合和 Rows 集合 ...
- ubuntu16.04 HyperLedger Fabric 1.2.0 开发环境搭建
安装准备 1. 安装git.cRUL.gcc/g++和make $ sudo apt-get update $ sudo apt-get install build-essential git cur ...
- spring @Configuration的使用
参考博客:https://www.cnblogs.com/duanxz/p/7493276.html spring中的@Scope注解 https://www.cnblogs.com/loneclo ...
- js obj对象转formdata格式代码
import isArray from "lodash/isArray" export function objToFormData(config) { //对象转formdata ...