[HNOI2007]梦幻岛宝珠
题解:
一道比较好的题目
首先比较显然的就是我们要按照a*2^b的b的顺序来枚举
那么状态f[i][j]表示当前在b,用了a*2^b
刚开始没想到怎么不同层之间搞
看了题解发现非常简单
由于每一层到最后一层有用的二进制位至少时从自己的二进制位开始
所以我们可以舍弃那些没用的二进制位
maxa(f[i][j],f[i][k]+f[i-1][(j-k)*2])
常数优化就是那个(j-k)*2可以再min个1000
另外f[i][j]其实是个前缀和优化,所以刚开始都为0就可以了
不太想写对拍然后统计的sum数组忘记开ll了。。。。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
const int N=;
int a[N],b[N],n,m,f[][];
struct re{
int a,b;
};
vector<re> ve[];
IL int max(rint x,rint y)
{
return x>y?x:y;
}
int main()
{
ios::sync_with_stdio(false);
while (cin>>n&&n!=-)
{
rep(i,,) ve[i].clear();
cin>>m;
rep(i,,n)
{
cin>>a[i]>>b[i];
int cnt=;
while (a[i]%==) a[i]/=,cnt++;
ve[cnt].push_back((re){a[i],b[i]});
}
int ans=;
ll sum=;
rep(i,,)
{
rep(j,,) f[i][j]=;
int l=int(ve[i].size())-;
rep(j,,l) sum+=ve[i][j].a*(<<i);
rep(k,,l)
dep(j,,ve[i][k].a)
{
f[i][j]=max(f[i][j],f[i][j-ve[i][k].a]+ve[i][k].b);
}
if (i)
{
int kk=sum/(<<i)+;
// int kk=1000;
dep(j,kk,)
dep(k,j,)
f[i][j]=max(f[i][j],f[i][k]+f[i-][min(,(j-k)*)]);
rep(j,kk+,) f[i][j]=f[i][j-];
// rep(j,0,1000) cout<<f[i][j]<<" ";
// cout<<endl;
}
if ((m>>i)&)
rep(j,,) f[i][j-]=f[i][j];
ans=max(ans,f[i][]);
}
cout<<ans<<endl;
}
return ;
}
[HNOI2007]梦幻岛宝珠的更多相关文章
- [BZOJ 1190][HNOI2007]梦幻岛宝珠
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1057 Solved: 611[Submit][Stat ...
- 【BZOJ1190】[HNOI2007]梦幻岛宝珠 分层背包DP
[BZOJ1190][HNOI2007]梦幻岛宝珠 Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. ...
- BZOJ 1190 [HNOI2007]梦幻岛宝珠(背包)
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1385 Solved: 798[Submit][Stat ...
- luogu 3188 [HNOI2007]梦幻岛宝珠
LINK:梦幻岛宝珠 时隔多日 我再次挑战这道题.还是以失败告终. 我觉得这一道背包真的有点难度 这是一个数量较少 但是价值和体积较大的背包. 通常的01背包 要不就是体积小 要么是价值小 但这道题给 ...
- 【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)
bzoj1190,懒得复制,戳我戳我 Solution: 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子.啃了三天才懂. \(dp[i][j]\)表示背包容积为\(j*2^ ...
- 1190: [HNOI2007]梦幻岛宝珠 - BZOJ
Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. 数据范围:N<=100;W<=2^30 ...
- [HNOI2007]梦幻岛宝珠(背包)
给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符 ...
- BZOJ.1190.[HNOI2007]梦幻岛宝珠(分层背包DP)
题目链接 把重量表示为\(a\times2^b\)的形式,然后按\(b\)排序. 从高到低枚举每一位,\(f[i]\)表示当前位容量为\(i\)时的最大价值(容量即\(a\times2^{bit}\) ...
- [HNOI2007]梦幻岛宝珠 「套路:分层 $DP$」
显然直接 \(01\) 背包会超时并且超空间 套路:分层 \(DP\) 「考虑将每个子结构看作一层(也就是包含了不止 \(1\) 个物品的信息),并且大层不会对小层造成影响,可以考虑先进行每一层的自我 ...
随机推荐
- python3+requests库框架设计05-unittest单元测试框架
unittest单元测试框架,主要由四部分组成:测试固件.测试用例.测试套件.测试执行器 测试固件(test fixture) 测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫 ...
- vc++基础班[24]---系统各种路径信息的获取
vc++基础班[24]---系统各种路径信息的获取 ------------------------------------------ Begin ------------------------- ...
- Markdown中Latex 数学公式基本语法
原文地址:http://blog.csdn.net/u014630987/article/details/70156489 Markdown中Latex 数学公式基本语法 公式排版 分为两种排版: - ...
- POJ3580 SuperMemo splay伸展树,区间操作
题意:实现一种数据结构,支持对一个数列的 6 种操作:第 x 个数到第 y 个数之间的数每个加 D:第 x 个数到第 y 个数之间全部数翻转:第 x 个数到第 y 个数之间的数,向后循环流动 c 次, ...
- <pre>标签的基本样式设置
断行 在html中,换行符无法在一般标签内作为布局控制显示,包括xml实体 和 均表现为white-space,仅用于断字[1]. 一般情形下,可使用<br>标签断行:但需要从原始xml文 ...
- ffmpeg h264 encdoer 速度对比
h264_qsv frame= 250 fps=0.0 q=-0.0 Lsize= 1401kB time=00:00:10.00 bitrate=1146.8kbits/s speed= 14x l ...
- git下载指定的版本
1.查看提交历史 sudo git log 打印如下内容: commit 2e3c19d412ab6a99bb51f338f71537a720a9c706 Author: huangbaog ...
- Qt5.10.1 在windows下vs2017静态编译
1.在计算机上安装python库和perl库(因为后续的静态编译需要用到这两种语言),可以在命令行敲击“python”和“perl -v”检查是否安装成功. 2.修改msvc-desktop.conf ...
- mysqlfrm初步使用
这个工具也就是读取frm文件生成建表语句默认的模式是再生个实例,使用--basedir选项或指定--server选项来连接到已经安装的实例.这种过程不会改变原始的.frm文件.该模式也需要指定--po ...
- css一些基础效果
1.旋转 .center>.bj>.div1>ul>li>.img1:hover {transform: rotate(-360deg);transition: 1s}/ ...