思路:分层dp,因为给的w都是a*(2 ^ b)的形式, 我们将这些物品按b分层, 我们设 dp[ i ][ j ]表示在 第 i 层 容量为(j << i)的最大值,

然后通过层与层之间dp 把dp[ i ][ j ] 扩充为   容量为(j << i) + W & ((1 << i - 1) - 1) 的最大值, 就能得出答案啦。

层和层之间的转移方程为:

dp[i][j] = max(dp[i][j], dp[i][k] + dp[i - 1][min(((j - k) << 1) + ((W >> (i - 1)) & 1), 1000)]);

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define pii pair<int,int>
  7. #define piii pair<int, pair<int,int>>
  8.  
  9. using namespace std;
  10.  
  11. const int N=+;
  12. const int M=1e4+;
  13. const int inf=0x3f3f3f3f;
  14. const LL INF=0x3f3f3f3f3f3f3f3f;
  15. const int mod=1e9 + ;
  16.  
  17. int n, W, two[N], ans, dp[][];
  18. struct node {
  19. node(int w, int v) {
  20. this -> w = w;
  21. this -> v = v;
  22. }
  23. int w, v;
  24. };
  25.  
  26. vector<node> v[];
  27.  
  28. void init() {
  29. ans = ;
  30. memset(dp, , sizeof(dp));
  31. for(int i = ; i <= ; i++)
  32. v[i].clear();
  33. }
  34.  
  35. int main() {
  36. two[] = ;
  37. for(int i = ; i <= ; i++)
  38. two[i] = two[i - ] * ;
  39.  
  40. while(scanf("%d%d", &n, &W) != EOF && n != -) {
  41. init();
  42. for(int i = ; i <= n; i++) {
  43. int w, val;
  44. scanf("%d%d", &w, &val);
  45. for(int i = ; i >= ; i--) {
  46. if(w % two[i] == ) {
  47. v[i].push_back(node(w / two[i], val));
  48. break;
  49. }
  50. }
  51. }
  52.  
  53. for(int i = ; i <= ; i++) {
  54. for(int u = ; u < v[i].size(); u++) {
  55. node k = v[i][u];
  56. for(int j = min(, W >> i); j >= k.w; j--) {
  57. dp[i][j] = max(dp[i][j], dp[i][j - k.w] + k.v);
  58. ans = max(ans, dp[i][j]);
  59. }
  60. }
  61. }
  62.  
  63. for(int i = ; i <= && ( << i) < W; i++) {
  64. for(int j = min(, W >> i); j >= ; j--) {
  65. for(int k = j; k >= ; k--) {
  66. dp[i][j] = max(dp[i][j], dp[i][k] + dp[i - ][min(((j - k) << ) + ((W >> (i - )) & ), )]);
  67. ans = max(ans, dp[i][j]);
  68. }
  69. }
  70. }
  71. printf("%d\n", ans);
  72. }
  73. return ;
  74. }
  75. /*
  76. */

bzoj 1190的更多相关文章

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

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

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

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

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

    题目链接 把重量表示为\(a\times2^b\)的形式,然后按\(b\)排序. 从高到低枚举每一位,\(f[i]\)表示当前位容量为\(i\)时的最大价值(容量即\(a\times2^{bit}\) ...

  4. BZOJ 1190 梦幻岛宝珠(分组01背包)

    跑了7000ms... 这是个体积和价值都超大的背包.但是体积保证为a*2^b的(a<=10,b<=30)形式.且n<=100. 于是可以想到按b来分组.这样的话每组最多为a*n*2 ...

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

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

  6. 背包dp相关

    0/1背包 给出n个物品,每个物品有Vi的价值和Wi的费用,我们总共有m块钱,求最多能得到多少价值的物品. N<=10^3,m<=10^3 记录方案数?记录输出方案? 输出方案: 对每个d ...

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

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

  8. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  9. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

随机推荐

  1. 【Revit API】脱离中心文件

    话不多说,直接代码,整个过程不需要发起Transaction OpenOptions op = new OpenOptions(); op.Audit = true; //是否需要核查 op.Deta ...

  2. 【拓扑 字符串还原 + 线段树维护】奇洛金卡达(father)

    奇洛金卡达(father) Description 阿良良木历将要迎来人生(不,是吸血鬼生涯)的第三次战斗——与身为人类的奇洛金卡达在直江津高中的操场solo,以取回Heartunderblade 的 ...

  3. 前端学习 -- Css -- 盒子模式

    框模型: CSS处理网页时,它认为每个元素都包含在一个不可见的盒子里. 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.我们只需要将相应的盒子摆放到网页 ...

  4. 螺旋队列和hiho1525逃离迷宫3

    我是真调不出错误了! hiho1525逃离迷宫3 #include <stdio.h> #include <stdlib.h> #include <math.h> ...

  5. C/S与B/S区别

    1.什么是C/S结构C/S (Client/Server)结构,即客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现, ...

  6. Qt ------ UDP发送不了或接收不到问题

    1.禁用不需要的网卡,比如禁用虚拟机网卡. 2.向所有网卡广播数据 /* * 直接调用 QUdpSocket 的 writeDatagram() 函数发送数据,如果有多张网卡(装了虚拟机会增加网卡), ...

  7. SQL Server - 开窗函数

    -- 开窗函数:在结果集的基础上进一步处理(聚合操作) SELECT * FROM dbo.Student S# Sname Sage Ssex ---------- ---------- ----- ...

  8. openstack项目【day23】:虚拟化介绍

    本节内容 一 什么是虚拟化 二 为何要学习虚拟化 三 虚拟化技术主要分类(了解) 四 平台虚拟化技术又可以细分(了解) 一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让 ...

  9. SqlParameter防止SQL注入

    SQL注入的解决方案有好几种,待我细细研究过之后逐一讲解. 方法一:SqlParameter方法 这里有一篇博客是详细介绍SqlParameter的,可以看看 点我 string sqlStr=&qu ...

  10. PythonCharm 配置本地反向代理激活

    以下方法仅做学习使用,如果条件允许,请自行购买正版软件,做开发的都知道软件开发出来不容易,能够支持就支持正版吧 首先去官网 下载 自己需要的 PYCHARM 版本 安装完启动会提示要激活, 选择 li ...