题目链接

把重量表示为\(a\times2^b\)的形式,然后按\(b\)排序。

从高到低枚举每一位,\(f[i]\)表示当前位容量为\(i\)时的最大价值(容量即\(a\times2^{bit}\))。对于同一位,直接\(01\)背包就行了。

如何转移到下一位?\(f[i]\)转移到\(f[i\times2+\text{W在这一位是否为1}]\)。注意到每一位的容量不会超过\(n\times a_{max}=1000\),所以再对\(1000\)取\(\min\)即可。

  1. //840kb 64ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. typedef long long LL;
  8. const int N=1005;
  9. struct Node
  10. {
  11. int a,b,val;
  12. bool operator <(const Node &x)const
  13. {
  14. return b>x.b;
  15. }
  16. }A[N];
  17. inline int read()
  18. {
  19. int now=0,f=1;register char c=gc();
  20. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  21. for(;isdigit(c);now=now*10+c-'0',c=gc());
  22. return now*f;
  23. }
  24. void Solve(int n,int m)
  25. {
  26. static int f[N],g[N];
  27. int mx=0;
  28. for(int i=1,a,b; i<=n; ++i)
  29. {
  30. a=read(), A[i].val=read();
  31. for(b=0; b<30&&!(a&1); ++b,a>>=1);
  32. mx=std::max(mx,a), A[i].a=a, A[i].b=b;
  33. }
  34. std::sort(A+1,A+1+n);
  35. const int lim=n*mx;
  36. memset(f,-0x3f,sizeof f);
  37. f[0]=0, A[n+1].b=-1;
  38. for(int i=30,now=1; ~i; --i)
  39. {
  40. memset(g,-0x3f,sizeof g);
  41. for(int j=0,p; j<=lim; ++j)
  42. p=std::min((j<<1)+(m>>i&1),lim), g[p]=std::max(g[p],f[j]);
  43. memcpy(f,g,sizeof f);
  44. for(; A[now].b==i; ++now)
  45. for(int ai=A[now].a,vi=A[now].val,j=0; j<=lim-ai; ++j)
  46. f[j]=std::max(f[j],f[j+ai]+vi);//f[i]:剩余容量为i
  47. }
  48. int ans=0;
  49. for(int i=0; i<=lim; ++i) ans=std::max(ans,f[i]);
  50. printf("%d\n",ans);
  51. }
  52. int main()
  53. {
  54. int n,m;
  55. while(n=read(),m=read(),n!=-1&&m!=-1) Solve(n,m);
  56. return 0;
  57. }

BZOJ.1190.[HNOI2007]梦幻岛宝珠(分层背包DP)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【bzoj 1190】梦幻岛宝珠(DP)

    这题是在01背包问题的基础上,扩充了重量,需要用时间换空间. 思路: 1.仔细看题,注意到重量wi为a*2^b(a<=10,b<=30),很容易想到要按 b 分开做背包的DP.接下来的重点 ...

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

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

  8. [HNOI2007]梦幻岛宝珠 「套路:分层 $DP$」

    显然直接 \(01\) 背包会超时并且超空间 套路:分层 \(DP\) 「考虑将每个子结构看作一层(也就是包含了不止 \(1\) 个物品的信息),并且大层不会对小层造成影响,可以考虑先进行每一层的自我 ...

  9. bzoj1190 [HNOI2007]梦幻岛宝珠 背包

    题目 https://lydsy.com/JudgeOnline/problem.php?id=1190 题解 好神仙的一道题啊. 既然 \(w_i = a_i\cdot 2^{b_i}\),那么不妨 ...

随机推荐

  1. Getting started with machine learning in Python

    Getting started with machine learning in Python Machine learning is a field that uses algorithms to ...

  2. shell正常运行,加入定时任务执行失败

    例如简单的ifconfig命令,在shell中运行成功,但是在crontab 中执行失败. 定位原因:环境变量 解决方案: whereis ifconfig 然后在shell中加入: PATH=PAT ...

  3. 嵌入式系统C编程之错误处理

    前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式.文中涉及的代码运行环境如下: 一  错误概念 1.1 错误分类 从严重性而言,程序错误可分为致命性和非致命性两类.对于致命性错误,无法执行 ...

  4. kmalloc vmalloc kzalloc malloc 和 get_free_page()【转】

    转自:http://blog.csdn.net/hbhhww/article/details/7236695 kmalloc vmalloc kzalloc get_free_page()是内核空间申 ...

  5. 优秀的gdb图形化前端调试器

    目前我自己最喜欢的还是 ddd . gdbgui 和 vim-vebugger插件或vimgdb插件 三种. You could try using Insight a graphical front ...

  6. openstack swift节点安装手册3-最后的安装配置及验证

    以下步骤都在controller节点上执行 1.远程获取/etc/swift/swift.conf文件: curl -o /etc/swift/swift.conf https://git.opens ...

  7. bzoj2588 Spoj10628. count on a tree

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  8. Vue.js——循环(Java、JSTL标签库、数据库)

    一.Vue.js循环 Vue.js循环要使用 v-for 指令. v-for 指令需要以 student in StudentList 形式的特殊语法使用, StudentList 是源数据数组并且s ...

  9. Day5-----------------vi编辑器

    1.操作模式 1).命令行模式 2).编辑模式 3).扩展模式 2.命令行模式 1).删除与复制 dd 删除光标所在行 ndd 删除光标向下n行 yy 复制光标所在行 nyy 复制光标乡下n行 2). ...

  10. mysql5.7安装教程图解

    启动安装包: 左边是你电脑上可以连接到mysql的软件,比如Visual Studio,Eclipse,PyCharm等,中间是需求的版本或者额外组件,右边是状态. 选择一个选项,然后点击下面的che ...