BZOJ4247挂饰
Description
Input
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挂饰相关推荐
- bzoj千题计划197:bzoj4247: 挂饰
http://www.lydsy.com/JudgeOnline/problem.php?id=4247 先把挂饰按挂钩数量从大到小排序 dp[i][j]前i个挂饰,剩下j个挂钩的最大喜悦值 分挂和不 ...
- bzoj4247 挂饰
4247: 挂饰 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1098 Solved: 440 [Submit][Status][Discuss ...
- bzoj4247: 挂饰(背包dp)
4247: 挂饰 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1136 Solved: 454 [Submit][Status][Discuss ...
- BZOJ4247: 挂饰
Description JOI君有N个装在手机上的挂饰,编号为1-N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂 ...
- 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 ...
- 【BZOJ4247】挂饰 背包
[BZOJ4247]挂饰 Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他 ...
- 【BZOJ4247】挂饰,又一个奇特的背包
Description JOI君有N个装在手机上的挂饰,编号为1-N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂 ...
- 【BZOJ4247】挂饰
Description JOI君有N个装在手机上的挂饰,编号为1-N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂 ...
- BZOJ 4247 挂饰 背包DP
4247: 挂饰 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id ...
最新文章
- 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
- MVC实现简单的上传功能
- java核心api_java核心API
- sonar.exclusions 配置无效问题
- 3D建模行业内幕及“钱”景
- Java I/O之字节流与字符流的区别
- echarts初次使用,自定义china-map省份默认颜色
- log4cpp 使用完全手册
- 计算标准累积正态分布_正态分布在用户等级划分的应用
- datax(13):源码解读Column-datax中的数据类型
- 转转代扣“支付通道费”被“放大”背后,二手交易的命门是什么?
- 一位资深程序员大牛给予Java初学者的学习建议
- 风骚的操作:区块链监控个人账户即时在线充值
- 防火墙阻止了从docker容器到外部的网络连接
- [SCTF2020]CloudDisk
- Win10家庭版远程桌面 : 出现身份验证错误,要求的函数不受支持 可能是由于CredSSP加密Oracle修正
- Android tips(十二)--Android开发中使用矢量图
- 菜鸟的数学建模之路(六):层次分析法
- 智慧水务信息化管理平台解决方案
- 开源是什么意思,你能举例说明吗
热门文章
- javaweb 获取服务器整个文件夹下的文件_详细得不要不要的 JavaWeb快速入门,值得收藏!...
- android网络编程登录和验证,ASP.NET实现用户注册和验证功能(第4节)
- Spark Streaming三种运行场景
- Python爬虫之(三)urllib库
- 从源码角度彻底理解ReentrantLock(重入锁)
- [转]文本分类入门(番外篇)特征选择与特征权重计算的区别
- 在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境
- 开启“互联网+”模式打造智能移动APP巡检系统
- DZY的根(思维水)
- 根据osdid 查询磁盘是ssd盘还是sas盘