CodeForces - 864E (背包+路径)

链接:http://codeforces.com/contest/864/problem/E

给出n个物品,以及每个物品的拿取所需时间,和最终时间(最终时间-1为可以拿取的时间),以及物品的价值。

问你可以拿到的最大价值值和一共拿取几件。同一时间只能够拿取一件,按照最大价值的拿取顺序输出。

思想:利用背包的特性,因为有最终时间和所需时间,利用01背包然后找去最佳拿取时间,最后利用vector将上一时间的物品,转化到此时。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 123
int dp[N*20];
struct node
{
    int time,end,d;
    int x;
}a[N];
int cmp(node e,node f)
{
    return e.end<f.end;
}
vector<int>Q[2100];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d",&a[i].time,&a[i].end,&a[i].d);
        a[i].x=i+1;
    }
    sort(a,a+n,cmp);
    memset(dp,0,sizeof(dp));    int maxx=0,t=0;
    for(int i=0;i<n;i++)
    {
        for(int j=a[i].end-1;j>=a[i].time;j--)
        {
            if(dp[j-a[i].time]+a[i].d>dp[j])
            {
                Q[j].clear();///清空之前保留的
                int len=Q[j-a[i].time].size();
                for(int k=0;k<len;k++)///利用背包特性,将上一个背包所需的物品转移
                    Q[j].push_back(Q[j-a[i].time][k]);
                Q[j].push_back(a[i].x);///加上此时要添加的物品
                dp[j]=dp[j-a[i].time]+a[i].d;///更新当前背包
                if(maxx<dp[j])///保留最大值以及最大值所在的时间
                    maxx=dp[t=j];
            }
        }
    }
    printf("%d\n%d\n",maxx,Q[t].size());
    for(int i=0;i<Q[t].size();i++)
        printf("%d%c",Q[t][i],i==Q[t].size()-1?‘\n‘:‘ ‘);
    return 0;
}

原文地址:https://www.cnblogs.com/a719525932/p/9081135.html

时间: 2024-10-31 12:30:35

CodeForces - 864E (背包+路径)的相关文章

Charlie&#39;s Change(完全背包+路径记忆)

Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3176   Accepted: 913 Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motores

Charlie&#39;s Change_完全背包&amp;&amp;路径记录

Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task. Your program will be given

H - Fire CodeForces - 864E 01背包

https://codeforces.com/problemset/problem/864/E 这个题目要把这个按照物品毁灭时间进行排序,如果时间短就要排在前面,这个是因为要保证之后的物品的拯救不会影响到之前的. #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <stack> #include <vector> #inc

浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 &amp;&amp; 路径记录 )

题目链接 分析 : 就是一个 0/1 背包,但是需要记录具体状态的转移情况 这个可以想象成一个状态转移图,然后实际就是记录路径 将状态看成点然后转移看成边,最后输出字典序最小的路径 这里有一个很巧妙的做法 先将所有的硬币升序排序(这一点很重要) 然后在这一条件下,假设当前状态是考虑第 i 个硬币,前一个状态是考虑第 i-1 个硬币 试想对于同一个体积,如果选用的硬币数量越多是不是字典序更小 然后对于如果对于同一体积下,选用硬币数一样多的两种方案 由于我们已经升序排序,如果有一样多硬币的情况,那么

Codeforces 864E - Fire(dp)

原题连接:http://codeforces.com/problemset/problem/864/E 题意:一个人想从大火中带走一些东西.每次他只能带一个,耗时ti ,价值为pi, 当总时间超过di时不能被带走.问他如何按顺序带走物品使价值总和最大. 思路:背包问题.分为取和不取两种情况1.dp[i][j]=max(dp[i-1][j], dp[i-1][j-t]+p), j<d; 2.dp[i][j]=max(dp[i-1][j], dp[i][j]); AC代码: 1 #include<

Codeforces 864E Fire(DP)

题目链接 Fire 题意 有n个物品,每个物品的挽救时间代价为ti, 消失时刻为di, 价值为pi. 如果要救某个物品,必须在他消失之前救出来. 同一时刻最多只能救一件物品. 当前耗时为当前已经救出的物品的ti累积. 你需要救出总价值尽可能大的物品,并输出方案. 考虑DP f[i][j]为考虑前i个物品,获得总价值为j的时候,所用时间的最小值. c[i][j]为在搜索到第i件物品,当前总价值为j的时候下一步的价值搜索状态. 则有f[i][j] = f[i - 1][j - a[i].p] + a

uva624 CD (01背包+路径的输出)

CD Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 624 Appoint description: Description Download as PDF You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is on CD

背包 [SWUST OJ] 594

Maximum Tape Utilization Ratio(0594) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 467 Accepted: 67 Description 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是li ,1 < = i < = n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序.在保证存储最多程序的前提下还要求磁

vijosP1071 新年趣事之打牌

链接:https://vijos.org/p/1071 [思路] 01背包+路径输出. 用d[][]记录[][]可转移的数目,>=2则输出-1,0输出0,否则输出路径.对于路径可以写一个递归过程print完成. 本题的数据着实有些坑,需要注意的有数组的范围,使用LL.题目中为什么没有交待? [代码] 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int maxn = 300+