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

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

Examples
Input
  1. 3
    3 7 4
    2 6 5
    3 7 6
Output
  1. 11
    2
    2 3
Input
  1. 2
    5 6 1
    3 3 5
Output
  1. 1
    1
    1
  2. 思路:有点像一个背包,dp数组记录的是当前时间所能获得的最大价值,转移方程dp[j]=max(dp[j],dp[j-t[i].ti]+t[i].w)
        path[i][j]表示到i号物品j时间的状态时救的物品编号(这里是从0开始)
        emmmmm 具体的在代码中加以注释。
  3. 代码:
    #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];
  4. bool cmp(node x,node y){
        if(x.en!=y.en)return x.en<y.en;
        else return x.ti<y.ti;
    }
  5. 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. hg (Mercurial)multiple heads (hg 多头)、撤销 commit,并保留修改

    有时候 commit 后才意识到还未 pull,这个时候会有如下提示: wlan-0-182:mobile-v2 lixiumei$ hg pull -upulling from ssh://hg@b ...

  2. input框在浏览器上显示一个叉,去掉方法

    /* 清除IE10及以上版本input的叉叉(X)和密码输入框的眼睛图标 */ input::-ms-clear { display: none; } input::-ms-reveal { disp ...

  3. 面向对象:静态属性,静态方法,组合,继承,衍生,继承之mro线性顺序列表,面向对象综合实例

    1.静态属性(附有装饰器) class Room: def __init__(self,name,owner,width,length,height): self.name=name self.own ...

  4. 使用密钥登录CentOS系统(基于密钥的认证)

    在Window客户端有多种软件可以登陆ssh,比如putty,xshelll,secureCRT,我就以xshell为例设置使用公钥和私钥验证登陆服务器. 使用Xshell密钥认证机制远程登录Linu ...

  5. 用openssl为WEB服务器生成证书(自签名CA证书,服务器证书)

    用openssl为WEB服务器生成证书(自签名CA证书,服务器证书) 来源: https://www.cnblogs.com/osnosn/p/10608455.html 来自osnosn的博客 写于 ...

  6. mysql合并表

    有如下两张表 a +------+------+---------+ | uid | name | addtime | +------+------+---------+ | | | +------+ ...

  7. CSS 不规则图形绘制

    基础技能1 - 神奇的border 我们先来画一个长方形: .Rectangle { height: 100px; width: 200px; background: darkgray; border ...

  8. SAS 统计某个数据集各个字段频数,并汇集到一个表中

    /*统计表的字段*/ PROC CONTENTS DATA=SASHELP.CLASS NOPRINT OUT=CA(KEEP=NAME); RUN; /*提取表的变量名*/ PROC SQL NOP ...

  9. ocr_vote disk损坏恢复

    1. 检查votedisk和 ocr备份[root@rh6rac1 bin]./ocrconfig -showbackuprh6rac1     2019/03/19 16:57:40     /or ...

  10. MySQL5.7.17解压版安装

    首先将mysql解压,公司的mysql解压后自带my.ini文件,结构如下: 在my.ini文件中配置的data路径在my文件夹下,需要删掉,然后修改my.ini文件中basedir和datadir路 ...