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 - p[i]] + t[i]
取最大值的时候考虑最大的i满足f[n][i] != INF即可。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 105;
const int Q = 2010; struct node{
int t, d, p;
int id;
friend bool operator < (const node &a, const node &b){
return a.d < b.d;
}
} a[N]; int f[N][Q], c[N][Q];
int n, cnt = 0;
int ans[N]; void solve(int i, int j){
if (i == 0) return;
if (c[i][j] != j) ans[++cnt] = a[i].id;
solve(i - 1, c[i][j]);
} int main(){ scanf("%d", &n);
rep(i, 1, n){
scanf("%d%d%d", &a[i].t, &a[i].d, &a[i].p);
a[i].id = i;
} sort(a + 1, a + n + 1); rep(i, 0, n) rep(j, 0, 2001) f[i][j] = 1 << 30;
f[0][0] = 0;
rep(i, 1, n){
rep(j, 0, 2000){
f[i][j] = f[i - 1][j];
c[i][j] = j;
if (j < a[i].p) continue;
int now = f[i - 1][j - a[i].p] + a[i].t;
if (now < f[i][j] && now < a[i].d){
f[i][j] = now;
c[i][j] = j - a[i].p;
}
}
} dec(i, 2000, 0) if (f[n][i] < (1 << 30)){
printf("%d\n", i);
solve(n, i);
printf("%d\n", cnt);
dec(j, cnt, 1) printf("%d ", ans[j]);
putchar(10);
break;
} return 0;
}
Codeforces 864E Fire(DP)的更多相关文章
- Codeforces 864E Fire(背包DP)
背包DP,决策的时候记一下 jc[i][j]=1 表示第i个物品容量为j的时候要选,输出方案的时候倒推就好了 #include<iostream> #include<cstdlib& ...
- codeforces Educational Codeforces Round 16-E(DP)
题目链接:http://codeforces.com/contest/710/problem/E 题意:开始文本为空,可以选择话费时间x输入或删除一个字符,也可以选择复制并粘贴一串字符(即长度变为两倍 ...
- Codeforces 1110D Jongmah (DP)
题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 解析:首先我们容易发现,我们 ...
- Codeforces 837D--Round Subset (DP)
原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...
- CodeForces 455A Boredom (DP)
Boredom 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/G Description Alex doesn't like b ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
随机推荐
- Codeforces Round #272 (Div. 2)-C. Dreamoon and Sums
http://codeforces.com/contest/476/problem/C C. Dreamoon and Sums time limit per test 1.5 seconds mem ...
- 74个Swift标准库函数
74个Swift标准库函数 本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swi ...
- jwt 登录
/* eslint-disable */ 'use strict'; const Controller = require('egg').Controller; const jwt = require ...
- VS第一天(一堆错误的错误示范)
自学VS第一天 (目标用vs做个不low的简历) 学习视频 https://www.bilibili.com/video/av48489320/?p=1 代码 写了一天的代码,自己理解的内容在注释里 ...
- js 类型之间的相互转化
设置元素对象属性 var img = document.querySelector("img") img.setAttribute("src","ht ...
- 快速入门Pandas
教你十分钟学会使用pandas. pandas是python数据分析的一个最重要的工具. 基本使用 # 一般以pd作为pandas的缩写 import pandas as pd # 读取文件 df = ...
- Python第三方库之openpyxl(5)
Python第三方库之openpyxl(5) 气泡图 气泡图类似于散点图,但使用第三个维度来确定气泡的大小,图表可以包括多个项目 from openpyxl import Workbook from ...
- 在myeclipse中使用查找功能
1.全局搜索(快捷键:ctrl+H) 在弹出对话框中选File Search选项,然后在第一个文本框中粘贴(我一般用粘贴)或自已手动录入(容易写错)要查找的字符串(可以是英文字符也可以是汉字),在第二 ...
- WCF学习-协议绑定
文章:无废话WCF入门教程三[WCF的宿主] 讲了net.tcp协议的wcf绑定.
- 九度oj题目1008:最短路径问题
题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 输入: ...