题目传送门

观察数据a*2^b,转化成二进制后,后面跟了b位的0,可以转化为一个分层背包。

先预处理出每个物品是哪一层的,并放在同层内DP。

同层内直接背包,考虑层与层之间的DP。

第一维枚举层数,然后做类似于背包的DP,细节看code。

code:

/**************************************************************
Problem: 1190
User: yekehe
Language: C++
Result: Accepted
Time:5932 ms
Memory:960 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int read()
{
char c;while(c=getchar(),c!='-'&&(c<''||c>''));
int x=,y=;c=='-'?y=-:x=c-'';
while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x*y;
} int w[],v[],f[][]; void work(int i)//预处理
{
for(int k=;k<=;k++)
if(w[i]&(<<k)){
for(int j=;j>=(w[i]>>k);j--)
f[k][j]=max(f[k][j-(w[i]>>k)]+v[i],f[k][j]);
return ;
}
} int main()
{
while(){
int N=read(),M=read(),ans=;
if(N<&&M<)break;
memset(f,,sizeof f);
for(int i=;i<=N;i++)
w[i]=read(),v[i]=read();
for(int i=;i<=N;i++)work(i);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
f[i][j]=max(f[i][j],f[i][j-]);
for(int i=;i<=&&<<i<=M;i++){//枚举层数
for(int j=min(,M>>i);j>=;j--){//枚举背包容量,类似01背包转移
for(int k=;k<=j;k++){
f[i][j]=max(f[i][j],f[i-][min((k<<)+(M>>i-&),)]+f[i][j-k]);//k*2是因为从上一层转移。
ans=max(ans,f[i][j]);
}
}
}
printf("%d\n",ans);
}
return ;
}

BZOJ1190_梦幻岛宝珠_KEY的更多相关文章

  1. [BZOJ 1190][HNOI2007]梦幻岛宝珠

    1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1057  Solved: 611[Submit][Stat ...

  2. 【BZOJ1190】[HNOI2007]梦幻岛宝珠 分层背包DP

    [BZOJ1190][HNOI2007]梦幻岛宝珠 Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. ...

  3. BZOJ 1190 [HNOI2007]梦幻岛宝珠(背包)

    1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1385  Solved: 798[Submit][Stat ...

  4. E - 梦幻岛宝珠 HYSBZ - 1190 变形01背包 难

    E - 梦幻岛宝珠 HYSBZ - 1190 这个题目我觉得很难,看题解都看了很久. 首先可以得到一个大概的思路就是分组,每一个数都可以分成 a*2^b  所以把b相同的数都分成一个组. 在每一组内部 ...

  5. luogu 3188 [HNOI2007]梦幻岛宝珠

    LINK:梦幻岛宝珠 时隔多日 我再次挑战这道题.还是以失败告终. 我觉得这一道背包真的有点难度 这是一个数量较少 但是价值和体积较大的背包. 通常的01背包 要不就是体积小 要么是价值小 但这道题给 ...

  6. 1190: [HNOI2007]梦幻岛宝珠 - BZOJ

    Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. 数据范围:N<=100;W<=2^30 ...

  7. luogu3188/bzoj1190 梦幻岛宝珠 (分层背包dp)

    他都告诉你能拆了 那就拆呗.把每个重量拆成$a*2^b$的形式 然后对于每个不同的b,先分开做30个背包 再设f[i][j]表示b<=i的物品中 容量为$ j*2^i+W\&((1< ...

  8. [HNOI2007]梦幻岛宝珠(背包)

    给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符 ...

  9. [HNOI2007]梦幻岛宝珠

    题解: 一道比较好的题目 首先比较显然的就是我们要按照a*2^b的b的顺序来枚举 那么状态f[i][j]表示当前在b,用了a*2^b 刚开始没想到怎么不同层之间搞 看了题解发现非常简单 由于每一层到最 ...

随机推荐

  1. Eigen学习

    Eigen 是一个基于C++的线性代数库,其中实现大量常用的线性代数算法,包括常规矩阵计算,矩阵变换,矩阵分解,矩阵块操作.Eigen 广泛地应用在开源项目中,例如OpenCV,PCL(Point C ...

  2. simple Terracotta session 同步

    部署前提: 配置好java环境和已有tomcat实例. 地址1:http://vdisk.weibo.com/s/dzUJr1vLcAWHl 地址2:http://code.taobao.org/p/ ...

  3. 机器学习数学知识中令人费解的notation符号注解

    $argmin_xf(x), min(f(x))$ $min(f(x))$的意思是函数$f(x)$的最小值 $argmin$的意思是返回使得表达式取得最小值时对应的输入变量值.例如$argmin_xf ...

  4. vuejs electron webpack集成使用

    传统的vue SPA页面在浏览器环境中使用,但是有的时候我们还希望能够做成一个类似于桌面的app在PC上使用,希望不仅可以使用所有的浏览器SPA的功能,你也可能外加host os的功能,比如文件的本地 ...

  5. linux上设置mysql编码

    linux下设置mysql编码 linux下设置mysql编码 首先查找MySql的cnf文件的位置: [root@flyHome gaoxiang]# find / -iname '*.cnf' - ...

  6. 《CDN 之我见》原理篇——CDN的由来与调度

    CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术.它能够有效解决网络带宽小.用户访问量大.网点分布不均等问题. 为了让大家更全面的了解 ...

  7. EF CodeFirst下的自动迁移

    当我们修改数据模型,添加一个如下字段 再次运行程序,会因为数据库结构与模型不一致而报错 为解决以上错误可以采取以下三种方式 1.  删除数据库,重新运行站点,会重新生成数据库,这样就会丢失数据 2.  ...

  8. zabbix日常监控Apache2.4

    Apache的安装请参考https://www.cnblogs.com/huangyanqi/p/9168637.html 1.修改配置 [root@apache ~]# httpd -v Serve ...

  9. IDEA使用心得整理

    [演出模式] 我们可以使用[Presentation Mode],将IDEA弄到最大,可以让你只关注一个类里面的代码,进行毫无干扰的coding. 可以使用Alt+V快捷键,弹出View视图,然后选择 ...

  10. node(一)安装nodejs最新版到debian,ubuntu,mint系统

    从官网得到,测试可以使用,本机为linux mint18 官网原文链接在此 //     直接使用sudo apt install nodejs安装的版本较老,而且命令必须使用nodejs //   ...