【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4247

【题目大意】

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

【题解】

  我们发现每个挂钩相当于代价为1-v,价值为c的物品,
  那么当代价小于0时,我们倒着做01背包,否则,正着做01背包,
  处理一下下标为负的问题即可。
  最后答案为dp[-n……1]的最大值。

【代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
const int M=2020;
using namespace std;
int n;
struct Array{
long long a[M<<1];
long long& operator [] (int x){
return a[min(max(x,-n),n)+2000];
}
}dp;
int main(){
while(~scanf("%d",&n)){
memset(&dp,0xef,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++){
int v,c;
scanf("%d%d",&v,&c); v=1-v;
if(v>0){for(int j=n;j>=-n;j--)dp[j+v]=max(dp[j+v],dp[j]+c);}
else{for(int j=-n;j<=n;j++)dp[j+v]=max(dp[j+v],dp[j]+c);}
}long long ans=0;
for(int i=-n;i<=1;i++)ans=max(ans,dp[i]);
printf("%lld\n",ans);
}return 0;
}

BZOJ 4247 挂饰(背包问题)的更多相关文章

  1. BZOJ 4247 挂饰 背包DP

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

  2. BZOJ 4247 挂饰 01背包

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4247 JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机 ...

  3. bzoj 4247: 挂饰【dp】

    bzoj上访问负下标会跑到奇怪的地方-- 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i-1][j],f ...

  4. BZOJ 4247: 挂饰 题解

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

  5. BZOJ 4247: 挂饰

    背包裸题 #include<cstdio> #include<algorithm> using namespace std; int F[2005]; struct node{ ...

  6. BZOJ 4247: 挂饰 动态规划

    按照挂件数量排序,然后做一个 DP 就好了. code: #include <bits/stdc++.h> #define ll long long #define N 2003 #def ...

  7. bzoj 4247挂饰

    背包????不会... #include<bits/stdc++.h> #define INF 0x7fffffff #define LL long long #define N 1000 ...

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

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

  9. bzoj4247: 挂饰(背包dp)

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

随机推荐

  1. bzoj 2440 容斥原理

    首先根据样例或者自己打表大概可以知道,对于询问k,答案不会超过k<<1,那么我们就可以二分答案,求当前二分的值内有多少个数不是完全平方数的倍数,这样就可以了,对于每个二分到的值x,其中完全 ...

  2. hdu 1869 六度分离(最短路floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others)    M ...

  3. Java多线程学习(一)Java多线程入门

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79640870 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  4. python 正则表达式口诀

    正则其实也势利,削尖头来把钱揣: (指开始符号^和结尾符号$)   特殊符号认不了,弄个倒杠来引路: (指\. \*等特殊符号)   倒杠后面跟小w, 数字字母来表示: (\w跟数字字母;\d跟数字) ...

  5. Join vs merge vs lookup

    The obvious benefit of merge over join is the ability to add reject links. I can't upload pictures. ...

  6. vs 2015 插件 supercharger 破解方式

    亲测有效:效果如图 方法如下: 1.打开Supercharger的options; 2.点击Pricing & Registration 3.复制 license  然后再按Paste &am ...

  7. linux网络编程之IO模型

    本文转自作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓 ...

  8. Ubuntu 14.04 ThinkPad E431无线网卡驱动安装

    Ubuntu 14.04下安装无线网卡驱动. sudo apt-get install linux-headers-generic build-essential dkms  sudo apt-get ...

  9. Redis缓存Mysql模拟用户登录Java实现实例[www]

    Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...

  10. sicily 1016. 排队接水--课程作业

                                                                                    1016. 排队接水 Time Limi ...