题目描述

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;
}

【bzoj4247】挂饰 背包dp的更多相关文章

  1. bzoj4247: 挂饰(背包dp)

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

  2. BZOJ 4247 挂饰 背包DP

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

  3. bzoj4247: 挂饰(背包)

    4247: 挂饰 题目:传送门 题解: 看完题目很明显的一道二维背包(一开始还推错了) 设f[i][j]表示前i个挂饰选完(可以有不选)之后还剩下j个挂钩的最大值(j最多贡献为n) 那么f[i][j] ...

  4. [BZOJ4247]挂饰(DP)

    当最终挂饰集合确定了,一定是先挂挂钩多的在挂挂钩少的. 于是按挂钩从大到小排序,然后就是简单的01背包. #include<cstdio> #include<algorithm> ...

  5. 【BZOJ4247】挂饰 背包

    [BZOJ4247]挂饰 Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他 ...

  6. 洛谷P4138 挂饰 背包

    正解:背包dp 解题报告: 昂先放链接qwq 感觉还挺妙的,,,真的我觉得我直接做可能是想不到背包的,,,我大概想不出是个背包的QAQ 但是知道是背包之后觉得,哦,好像长得也确实挺背包的吼,而且其实是 ...

  7. BZOJ4247挂饰

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

  8. bzoj千题计划197:bzoj4247: 挂饰

    http://www.lydsy.com/JudgeOnline/problem.php?id=4247 先把挂饰按挂钩数量从大到小排序 dp[i][j]前i个挂饰,剩下j个挂钩的最大喜悦值 分挂和不 ...

  9. BZOJ4247 : 挂饰

    首先将挂饰按照挂钩个数从大到小排序,然后DP 设f[i][j]处理完前i个挂饰,还有j个多余挂钩的最大喜悦值,则 f[0][1]=0 f[i][j]=max(f[i-1][max(j-a[i],0)+ ...

随机推荐

  1. SAP Cloud for Customer客户主数据的地图集成

    点击这个按钮可以通过地图的方式查看C4C客户在地图上的地理位置: 只需要在这个客户的地址栏里维护上天府软件园的经度和维度: 就能够在C4C的客户列表页面里显示该客户在地图上的位置: 要获取更多Jerr ...

  2. noip模拟赛#14

    #14: T1:f[x]=x-1(x&1)||x/2(x&1=0) 求[n,m]有多少个数可以通过变换得到k.(1e9). =>好像cf上看过类似的题,用二进制的方式来写.不过我 ...

  3. tcp、http和socket的区别

    本文原链接:https://www.jianshu.com/p/88d69454bdde tcp.http和socket的区别 一:tcp协议 tcp协议属于传输层协议(UDP也属于传输层协议,但是U ...

  4. python 与 json

    +-------------------+---------------+    | Python            | JSON          |    +================= ...

  5. IDEA 官方背景与修改jsp模板以及字体大小

    一.官方背景切换 方法一:先打开file找到Settings  如图: 也可以用快捷方式打开:Ctrl+alt+s  打开 找到Editor点击进入 ,再然后找Color Scheme 可以看到如下图 ...

  6. php常见验证

    /** * 文件上传 * @param $file 要上传的文件 * @param $size 大小设置 * @param $ext 文件类型 * @return bool 是否上传成功 */func ...

  7. NOIP2013 表达式求值

    题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计算的表达式,表达式中只包含数字. ...

  8. shell 练习题

    1.编写脚本/bin/per.sh,判断当前用户对指定参数文件,是否不可读并且不可写 read -p "Please Input A File: " file if [ ! -e ...

  9. ipmitool的使用

    https://www.ibm.com/developerworks/cn/linux/l-ipmi/index.html

  10. mysql 的 case when 用法

    正确的格式: case when condition then result when condition then result when condition then result else re ...