Description

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

Input

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

Output

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

Solution

与普通背包不同的地方在于,这里背包的容量是动态的,所以用f[i][j]表示前i件物品中,满足还剩j个挂钩空着的最大愉悦值,就解决了背包容量未知的问题,然后状态转移方程的推导与01背包相似,如果不取第i个,最优解就是f[i-1][j],如果取,f[i-1][max(j-a[i],0)+1]+b[i]。因为如果不取这个挂饰,挂钩数就只剩下j-a[i]+1个,但这个表达式的值有可能是一个负数,没有意义,所以要取最差的情况,即舍弃所有挂饰,只剩手机上原来的那个挂钩,也就是1个挂钩。

但是有些时候,j-a[i]+1为负数也可能有意义。因为挂钩的位置没有要求,只要后来的挂钩能把j补成非负数就是合法的,但如果去考虑这个,动规的循环变量就不确定,所以要把挂饰按能提供的挂钩数量从大到小排序,就能避免这种情况。

(参考:http://www.cnblogs.com/2014nhc/p/6231288.html)

Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int f[2111][2111];
 7
 8 struct rec
 9 {
10     int a,b;
11 }x[2111];
12
13 int cmp(const rec&x1,const rec&x2)
14 {
15     return x1.a>x2.a;
16 }
17
18 int max(int a,int b)
19 {
20     return a>b?a:b;
21 }
22
23 int main()
24 {
25     int n;
26     scanf("%d",&n);
27     for (int i=1; i<=n; i++)
28       scanf("%d%d",&x[i].a,&x[i].b);
29     sort(x+1,x+n+1,cmp);
30     memset(f,-210000000,sizeof(f));
31     f[0][1]=0;
32     for (int i=1; i<=n; i++)
33       for (int j=0; j<=n; j++)
34         f[i][j]=max(f[i-1][j],f[i-1][max(j-x[i].a,0)+1]+x[i].b);
35     int ans=0;
36     for (int i=0; i<=n; i++)
37       ans=max(ans,f[n][i]);
38     printf("%d",ans);
39     return 0;
40 } 

Source

http://www.lydsy.com/JudgeOnline/problem.php?id=4247

转载于:https://www.cnblogs.com/Patrick-X/p/6252720.html

BZOJ4247挂饰相关推荐

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

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

  2. bzoj4247 挂饰

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

  3. bzoj4247: 挂饰(背包dp)

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

  4. BZOJ4247: 挂饰

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

  5. bzoj4247: 挂饰(01背包)

    状态:f[ i ][ j ]表示选到第 i 个物品时还剩 j 个勾 转移:f[i][j]=max(f[i-1][j-edge[i].gou+1>1?j-edge[i].gou+1:1]+edge ...

  6. 【BZOJ4247】挂饰 背包

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

  7. 【BZOJ4247】挂饰,又一个奇特的背包

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

  8. 【BZOJ4247】挂饰

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

  9. BZOJ 4247 挂饰 背包DP

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

最新文章

  1. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
  2. MVC实现简单的上传功能
  3. java核心api_java核心API
  4. sonar.exclusions 配置无效问题
  5. 3D建模行业内幕及“钱”景
  6. Java I/O之字节流与字符流的区别
  7. echarts初次使用,自定义china-map省份默认颜色
  8. log4cpp 使用完全手册
  9. 计算标准累积正态分布_正态分布在用户等级划分的应用
  10. datax(13):源码解读Column-datax中的数据类型
  11. 转转代扣“支付通道费”被“放大”背后,二手交易的命门是什么?
  12. 一位资深程序员大牛给予Java初学者的学习建议
  13. 风骚的操作:区块链监控个人账户即时在线充值
  14. 防火墙阻止了从docker容器到外部的网络连接
  15. [SCTF2020]CloudDisk
  16. Win10家庭版远程桌面 : 出现身份验证错误,要求的函数不受支持 可能是由于CredSSP加密Oracle修正
  17. Android tips(十二)--Android开发中使用矢量图
  18. 菜鸟的数学建模之路(六):层次分析法
  19. 智慧水务信息化管理平台解决方案
  20. 开源是什么意思,你能举例说明吗

热门文章

  1. javaweb 获取服务器整个文件夹下的文件_详细得不要不要的 JavaWeb快速入门,值得收藏!...
  2. android网络编程登录和验证,ASP.NET实现用户注册和验证功能(第4节)
  3. Spark Streaming三种运行场景
  4. Python爬虫之(三)urllib库
  5. 从源码角度彻底理解ReentrantLock(重入锁)
  6. [转]文本分类入门(番外篇)特征选择与特征权重计算的区别
  7. 在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境
  8. 开启“互联网+”模式打造智能移动APP巡检系统
  9. DZY的根(思维水)
  10. 根据osdid 查询磁盘是ssd盘还是sas盘