题目描述

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

输入

第一行一个整数N,代表挂饰的个数。
接下来N行,第i行(1<=i<=N)有两个空格分隔的整数Ai和Bi,表示挂饰i有Ai个挂钩,安装后会获得Bi的喜悦值。 

输出

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

样例输入

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

样例输出

5


题解

背包dp

根据题意很容易想到dp状态:f[i][j]表示从前i个物品中选择某些物品,使得剩下的挂钩数量为j的最大喜悦值。

但是这样会TLE。

思考:一个物品,最多只会消耗1个挂钩。因此如果已经有了大于等于超过n个挂钩,说明全部物品都可以挂上,记录过多的状态也就没有了意义。

所以我们把j的上界设为n即可,dp时取j+ai和n的最小值作为状态即可。

注意要先按照挂钩数量从大到小排序(其实不排序也行,就是会比较麻烦)

代码中把状态压到了一维,需要注意一下更新顺序啥的。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 2010
using namespace std;
struct data
{
int a , b;
}w[N];
int f[N];
bool cmp(data x , data y)
{
return x.a > y.a;
}
int main()
{
int n , i , j , ans = 0;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &w[i].a , &w[i].b) , w[i].a -- ;
sort(w + 1 , w + n + 1 , cmp);
memset(f , 0xc0 , sizeof(f)) , f[1] = 0;
for(i = 1 ; i <= n ; i ++ )
{
if(~w[i].a) for(j = n ; j ; j -- ) f[min(j + w[i].a , n)] = max(f[min(j + w[i].a , n)] , f[j] + w[i].b);
else for(j = 1 ; j <= n ; j ++ ) f[j - 1] = max(f[j - 1] , f[j] + w[i].b);
for(j = 0 ; j <= n ; j ++ ) ans = max(ans , f[j]);
}
printf("%d\n" , ans);
return 0;
}

最新文章

  1. [Erlang 0115] 2014值得期待的Erlang两本新书
  2. MVC中得到成员元数据的Description特性描述信息公用方法
  3. 通过Request对象对cookie的设置、获取
  4. IOS开发——使用数据库
  5. ubuntu使用
  6. JS中标准对象
  7. web.xml中load-on-startup的作用(转)
  8. node基础再现--module.exports 和exports
  9. dubbo源码分析三:consumer注册及生成代理对象
  10. Orchard开源ASP.NET MVC CMS简介
  11. C#微信公众号开发——错误一
  12. hihiocoder 1255(搜索)(2015ACM/ICPC北京站)
  13. 自制node.js + npm绿色版
  14. Java学习笔记(二十四):单例设计模式singleton
  15. JS-JS变量命名规则
  16. BZOJ2306: [Ctsc2011]幸福路径
  17. hive中解决中文乱码
  18. java中多个数字运算后值不对(失真)处理方法
  19. Maven常用dependency记录
  20. ROS多线程订阅消息

热门文章

  1. UVALive 3942 Remember The Word (Tire)
  2. 使用FontDialog组件设置字体
  3. 在DataGridView控件中隔行换色
  4. python_102_属性方法
  5. java基础—多态(动态加载)
  6. ios sinaweibo 客户端(一)
  7. JS - 生成UUID
  8. jmeter接口测试 ——学习笔记
  9. 剑指Offer(书):顺时针打印数组
  10. 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)