题意:失火了,有n个物品,每个物品有价值pi,必须在时间di前(小于di)被救,否则就要被烧毁。救某个物

    品需要时间ti,问最多救回多少价值的物品,并输出救物品的顺序。

Examples
Input
3
3 7 4
2 6 5
3 7 6
Output
11
2
2 3
Input
2
5 6 1
3 3 5
Output
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+输出路径)的更多相关文章

  1. Codeforces Round #436 (Div. 2)【A、B、C、D、E】

    Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...

  2. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  3. Codeforces 730J:Bottles(背包dp)

    http://codeforces.com/problemset/problem/730/J 题意:有n个瓶子,每个瓶子有一个当前里面的水量,还有一个瓶子容量,问要把所有的当前水量放到尽量少的瓶子里至 ...

  4. Codeforces 922 E Birds (背包dp)被define坑了的一题

    网页链接:点击打开链接 Apart from plush toys, Imp is a huge fan of little yellow birds! To summon birds, Imp ne ...

  5. 机器分配——线性dp输出路径

    题目描述 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15 ...

  6. POJ-1015(背包变形+输出路径)

    Jury Compromise POJ-1015 推荐几个较好的介绍和理解:https://blog.csdn.net/lyy289065406/article/details/6671105 htt ...

  7. 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 ...

  8. Codeforces Round #436 (Div. 2) E. Fire(背包+记录路径)

    传送门 题意 给出n种物品,抢救第\(i\)种物品花费时间\(t_i\),价值\(p_i\),截止时间\(d_i\) 询问抢救的顺序及物品价值和最大值 分析 按\(d_i\)排序的目的是防止以下情况 ...

  9. Codeforces Round #436 (Div. 2) E. Fire

    http://codeforces.com/contest/864/problem/E 题意: 有一堆物品,每个物品有3个属性,需要的时间,失效的时间(一开始)和价值.只能一件一件的选择物品(即在选择 ...

随机推荐

  1. 单例模式实例&多线程应用

    单例模式是指:对于一个类在内存中只能存在唯一一个对象,这种设计模式叫做单例设计模式. 单例设计模式的写法: 1. 设置私有(private)的构造方法. 2. 实例化一个该类的对象作为成员变量,并设置 ...

  2. h5需要的浏览器插件

    google浏览器插件: web前段助手.vue-tools.草料二维码

  3. JetBrains GoLand 注册码

    选择license server 输入 http://idea.youbbs.org 完成 要求联网

  4. IMU(LPMS-B2) ROS下使用教程

    一.基本信息 http://www.alubi.cn/lpms-b2/ 安装ros教程 http://wiki.ros.org/lpms_imu https://lp-research.com/ros ...

  5. winform 打印时的默认单位

    通过设置Graphics.PageUnit,是枚举类型GraphicsUnit,默认是display(指定显示设备的度量单位. 通常,视频显示使用的单位是像素:打印机使用的单位是 1/100 英寸.)

  6. configEnvironment()源码探究

    该方法目的是对上面刚创建的环境对象进行相关配置,包含两步:配置属性源和配置活跃profiles. 其中配置属性源如下: 1.首先获取属性源 2.然后将默认属性源添加到属性源中 3.然后将命令行属性源添 ...

  7. 【java】之算法复杂度o(1), o(n), o(logn), o(nlogn)

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  8. JS语法基础

    js声明 <!--在head标签中使用script标签进行js代码域声明--> <script type="text/javascript" language=& ...

  9. NodeJs Fs模块

    和前面的Http.Url模块一样,Fs模块也是node的核心模块之一,主要用于对系统文件及目录进行读写操作. 基本方法 fs.stat fs.stat可以用来判断是文件还是目录:stats.isFil ...

  10. 2、Redis 底层原理:Cluster 集群部署与详解

    Redis 简介 Redis 提供数据缓存服务,内部数据都存在内存中,所以访问速度非常快. 早期,Redis 单应用服务亦能满足企业的需求.之后,业务量的上升,单机的读写能力满足不了业务的需求,技术上 ...