题目翻译

JOI 君有 n n n 个装在手机上的挂饰,编号为 1 … n 1 \ldots n 1…n。 JOI 君可以将其中一些挂饰装在手机上。
JOI 君的挂饰有一些与众不同——其中的一些挂饰附有挂钩,你可以将其他挂饰挂在挂钩上。 i i i 号挂饰有 A i A_i Ai​ 个挂钩。每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上。直接挂在手机上的挂件最多有 1 1 1 个。
此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示。如果 JOI 君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数。
JOI 君想要最大化所有挂饰的喜悦值之和。注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的。

输入格式

第一行一个整数 n n n,代表挂饰的个数。
接下来 n n n行,第 i i i 行有两个空格分隔的整数 A i A_i Ai​ 和 B i B_i Bi​,表示挂饰 i i i 有 A i A_i Ai​ 个挂钩,安装后会获得 B i B_i Bi​ 的喜悦值。

输出格式

输出一行,一个整数,表示手机上连接的挂饰总和的最大值。

样例

样例输入

5
0 4
2 -2
1 -1
0 1
0 3

样例输出

5

样例说明

挂饰 2 2 2 直接挂在手机上,然后将挂饰 1 1 1 和挂饰 5 5 5 分别挂在挂饰 2 2 2 的两个挂钩上,可以获得最大喜悦值 4 − 2 + 3 = 5 4-2+3=5 4−2+3=5。

分析

首先,这显然是一道01背包问题。定义 d p [ i ] dp[i] dp[i] 为剩余挂饰 i i i 个能获得的最大价值。容易写出 O ( n m ) O(nm) O(nm) 的01板子,可这样会TLE。
不妨设想一下,对于第 i i i 个挂饰,如果之前有超过 n n n 个剩余挂钩,那么就算不用这个挂饰的挂钩,也不影响最后答案。
这样的话,第二重循环便只用循环到 n n n ,时间复杂度 O ( n 2 ) O(n^2) O(n2)。
这里还需要注意两个细节:
1.若 α \alpha α 比 β \beta β 喜悦值大,比 β \beta β挂钩少,若选 β \beta β 是正解,如果 α \alpha α 在 β \beta β 前面,我们选的会是 α \alpha α,如果 β \beta β 在 α \alpha α 前面,则不影响答案。
所以这里要用贪心的思想,将挂钩多的挂饰放在前面处理。
2.第二重循环为什么一个正序一个逆序,这个希望读者自行思考。(提示:一维数组01背包的性质)

代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <climits>
using namespace std;
const int MAXN = 2005, inn = INT_MIN;
struct Node {int A, B;
}arr[MAXN * MAXN];
int dp[MAXN];
bool vis[MAXN];
bool cmp(Node x, Node y) {return x.A > y.A;
}
int main() {int n, maxx = 0;scanf("%d", &n);for(int i = 1; i <= n; i ++) {scanf("%d%d", &arr[i].A, &arr[i].B);}sort(arr + 1, arr + 1 + n, cmp);//贪心 for(int i = 1; i <= n; i ++) dp[i] = inn;dp[1] = 0; vis[1] = 1;for(int i = 1; i <= n; i ++) {//01背包 if(arr[i].A > 0) {for(int j = n; j >= 1; j --) { if(!vis[j]) continue;vis[min(j - 1 + arr[i].A, n)] |= vis[j];dp[min(j - 1 + arr[i].A, n)] = max(dp[min(j - 1 + arr[i].A, n)], dp[j] + arr[i].B);}}else {for(int j = 1; j <= n; j ++) {if(!vis[j]) continue;vis[min(j - 1 + arr[i].A, n)] |= vis[j];dp[min(j - 1 + arr[i].A, n)] = max(dp[min(j - 1 + arr[i].A, n)], dp[j] + arr[i].B);}}}for(int i = 0; i <= n; i ++) {maxx = max(maxx, dp[i]);}printf("%d", maxx);return 0;
}

「JOISC 2014 Day4」挂饰(背包DP)题解相关推荐

  1. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

  2. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 题解部分: (如果不怎么喜欢看推导的人可以直接看下面的关键部分,在段尾会有标注(或者看完定义直接看代码)) 本题让我们求到达点n需要最晚何时到达点1,我们可 ...

  3. 「JOISC 2014 Day3」稻草人

    「JOISC 2014 Day3」稻草人 问题简述 解析 代码 问题简述 链接 https://loj.ac/problem/2880   给定 n n n个稻草人(横纵坐标是不大于 1 0 9 10 ...

  4. bzoj 4247: 挂饰 背包dp

    题意 JOI君有N个装在手机上的挂饰,编号为1-N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂在手机上,要么挂在 ...

  5. BZOJ 4247 挂饰 背包DP

    4247: 挂饰 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  6. bzoj4247: 挂饰(背包dp)

    4247: 挂饰 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1136  Solved: 454 [Submit][Status][Discuss ...

  7. bzoj4244 loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直 ...

  8. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  9. LOJ #2878. 「JOISC 2014 Day2」邮戳拉力赛 动态规划+括号序列

    神题呀,我们观察到行走的方式一定是一条链+若干条环. 然后环可以看成是一对括号,所以来一个基于括号序的 DP. code: #include <bits/stdc++.h> #define ...

最新文章

  1. 【栈】日志分析(BSOJ2981)
  2. mysql gtid 5.7_MySQL5.7之GTID复制
  3. python散点图图例只显示一个标记点_python – Matplotlib图例:如何分配多个散点值...
  4. leetcode 637. Average of Levels in Binary Tree | 637. 二叉树的层平均值(Java)
  5. 【文末福利】如何用精密算法解决未婚妻问题?
  6. scrapy —— ImagePipeline
  7. android frida 检测_Android 逆向 | Frida 是万能的吗? 检测 Frida 的几种办法
  8. 微信小程序云开发教程-WXML入门-条件渲染
  9. Appium+网易mumu模拟器+python 使用笔记
  10. 创造下一个Zynga传奇
  11. Leetcode之机器人大冒险
  12. wps for linux显示系统缺失字体解决办法
  13. 使用shell比较两个文本的差异
  14. java gef_GEF开发入门要点(个人经验)
  15. 查询收尾、带子查询的数据更新、视图 4.12数据库课程实验
  16. 《星际穿越》初解析——一部空前绝后的史诗科学巨作
  17. 数组元素循环左移n个位置(JAVA)
  18. C++ 家族关系查询
  19. 独立后台月老办事处一元交友盲盒微信小程序源码下载,可自定义价格
  20. Mac上Logi Options安装问题

热门文章

  1. 什么是 web 语义化?有什么好处?
  2. PotPlayer播放器中英双字幕设置
  3. POJ3273:Monthly Expense(二分)
  4. redis RedisCommandExecutionException: NOAUTH Authentication required
  5. 基金投资必修课一---基金该如何止盈
  6. Bugzilla与BugFree区别与比较
  7. 问题解决Xshell :No matching outgoing encryption algorithm found
  8. 【每日早报】2019/09/11
  9. 获取一个字节byte的某位bit
  10. Win10下findfont: Font family [‘sans-serif‘] not found中文显示问题解决方法