H - Fire CodeForces - 864E 01背包

https://codeforces.com/problemset/problem/864/E

这个题目要把这个按照物品毁灭时间进行排序,如果时间短就要排在前面,这个是因为要保证之后的物品的拯救不会影响到之前的。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 2e3 + 10;

struct node
{
    int t, p, d, id;
}exa[maxn];

bool cmp(node a,node b)
{
    return a.d < b.d;
}

int G[110][2200];
int dp[2200];

int main()
{
    int n;
    int V = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d%d%d", &exa[i].t, &exa[i].d, &exa[i].p);
        exa[i].id = i;
        V = max(V, exa[i].d);
    }
    sort(exa + 1, exa + 1 + n, cmp);
    //for (int i = 1; i <= n; i++) printf("www %d %d %d\n", exa[i].t, exa[i].d, exa[i].p);
    int ex = 0, x = 0, y = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = exa[i].d-1; j >= exa[i].t; j--)
        {
            if (dp[j - exa[i].t] + exa[i].p > dp[j])
            {
                dp[j] = dp[j - exa[i].t] + exa[i].p;
                G[i][j] = 1;
            }
            if(dp[j]>ex)
            {
                ex = dp[j];
                x = i, y = j;
            }
        }
    }
    printf("%d\n", ex);
    stack<int>ans;
    int i = x, j = y;
    while (i > 0)
    {
        if(G[i][j])
        {
            ans.push(exa[i].id);
            j -= exa[i].t;
        }
        i -= 1;
    }
    printf("%d\n", (int)ans.size());
    while(!ans.empty())
    {
        printf("%d ", ans.top());
        ans.pop();
    }
    printf("\n");
    return 0;
}

原文地址:https://www.cnblogs.com/EchoZQN/p/10925376.html

时间: 2024-11-05 18:39:21

H - Fire CodeForces - 864E 01背包的相关文章

Codeforces 336C 0-1背包

题意:每个水果有两个值,一个美味度 a,一个卡路里 b,从中挑选一些,要求 sum(aj) / sum(bj) = k,使得 sum(a) 最大. 分析:没有那个条件就是一个01背包,可以转换,对公式变形,每个水果的重量为 a[i] - b[i] *k ,那么无论怎么挑选,都满足那个条件,价值是 a[i] 但是,a[i] - b[i] *k 可能为负,那么可以分类讨论,背包容量10000即可,最后枚举背包容量,能够达到的值是两个部分的和. #include <bits/stdc++.h> us

CodeForces - 864E (背包+路径)

链接:http://codeforces.com/contest/864/problem/E 给出n个物品,以及每个物品的拿取所需时间,和最终时间(最终时间-1为可以拿取的时间),以及物品的价值. 问你可以拿到的最大价值值和一共拿取几件.同一时间只能够拿取一件,按照最大价值的拿取顺序输出. 思想:利用背包的特性,因为有最终时间和所需时间,利用01背包然后找去最佳拿取时间,最后利用vector将上一时间的物品,转化到此时. #include<cstdio> #include<cstring

转化一下就是01背包 CodeForces 433A - Kitahara Haruki&#39;s Gift

Kitahara Haruki has bought n apples for Touma Kazusa and Ogiso Setsuna. Now he wants to divide all the apples between the friends. Each apple weights 100 grams or 200 grams. Of course Kitahara Haruki doesn't want to offend any of his friend. Therefor

codeforces 742D Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses ——(01背包变形)

题意:给你若干个集合,每个集合内的物品要么选任意一个,要么所有都选,求最后在背包能容纳的范围下最大的价值. 分析:对于每个并查集,从上到下滚动维护即可,其实就是一个01背包= =. 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <vector> 5 using namespace std; 6 const int N = 1000 + 5;

01背包 Codeforces Round #267 (Div. 2) C. George and Job

题目传送门 1 /* 2 题意:选择k个m长的区间,使得总和最大 3 01背包:dp[i][j] 表示在i的位置选或不选[i-m+1, i]这个区间,当它是第j个区间. 4 01背包思想,状态转移方程:dp[i][j] = max (dp[i-1][j], dp[i-m][j-1] + sum[i] - sum[i-m]); 5 在两个for循环,每一次dp[i][j]的值都要更新 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #i

codeforces 842C Ilya And The Tree (01背包+dfs)

(点击此处查看原题) 题目分析 题意:在一个树中,有n个结点,记为 1~n ,其中根结点编号为1,每个结点都有一个值val[i],问从根结点到各个结点的路径中所有结点的值的gcd(最大公约数)最大是多少,其中,我们可以将路径中某一个结点的值变为0,也可以选择不变. 思路:注意到对于每个结点,我们可以选择这个结点,或者不选这个结点(将权值记为0),因而有点01背包的感觉,而我们求gcd的时候需要取所有情况中的最大值 那么我们从根结点开始,每经过一个结点,就从其父节点的所有情况转移得到当前结点的状态

[CF837D] Round Subset(滚动数组,01背包)

题目链接:http://codeforces.com/contest/837/problem/D 题意:n个数里选k个数,使得它们的乘积末尾0个数最多. 只需要统计每个数的2和5的数量,一个作为容量,一个作为价值.f(i,k,j)表示前i个数选k个,一共有j个2的时候,5最多有几个. 外层枚举前i个数,内层做01背包就可以.但是会MLE,所以滚动数组. 特别注意的是,滚动数组在滚动的时候要拷贝整层,原因是我在更新01背包的时候没有及时复制... 还有f要注意当前层一定要从之前存在的状态更新过来,

hdu 1864 01背包 最大报销额

http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18562    Accepted Submission(s): 5459

超大背包(挑战编程之01背包)

先来温习01背包: 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2--Wn,与之相对应的价值为P1,P2--Pn. 求出获得最大价值的方案. 注意:在本题中,所有的体积值均为整数. 思路: 考虑用动态规划的方法来解决,这里的:阶段是:在前N件物品中,选取若干件物品放入背包中:状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值:决策是:第N件物品放或者不放:由此可以写出动态转移方程:我们用f[i,j]表示在前 i 件物品中选择若干件放