显然直接 \(01\) 背包会超时并且超空间

套路:分层 \(DP\)

「考虑将每个子结构看作一层(也就是包含了不止 \(1\) 个物品的信息),并且大层不会对小层造成影响,可以考虑先进行每一层的自我更新(即用当前层物品更新当前层答案),再进行层的合并,此时考虑低层对高层的影响」

正题

那么这题有一个特殊性质: \(V_i = a \times 2^b\)

b值大的物品不会影响零碎剩余的重量上限。

将物品按b值分阶段处理。

那么就是分层 \(DP\)

先通过普通的 \(01\) 背包更新当前层自身最优解

再进行层合并:

令 \(g_{i, j}\) 表示第 \(i\) 层,\(a\) 为 \(j\) 的最优解,\(f_{i, j}\) 表示第 \(i\) 层,\(a\) 为 \(j\),并且再加上 \(V_{total}\) 的 \(1...i - 1\) 位的最优解

那么对于第 \(i\) 层,枚举当前 \(j\)

对于转移,枚举在自身层内消耗的空间 \((j - k) \times 2^i\),那么还剩下 \(k \times 2^i + V_{total}\{1...i - 1\}\) 的空间,分配给上一层,那么可得转移方程为

(注:\(w_i\) 表示 \(V_{total}\) 第 \(i\) 位)

\[f_{i, j} = \max \{g_{i, j - k} + f_{i - 1, 2k + w_i}\}
\]

同时,\(g_{i, j}\) 可以通过由大到小枚举来消除

代码

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; typedef long long LL; const int MAXN = 30 + 10;
const int MAXM = 1000 + 10; int N, M; LL f[MAXN][MAXM]= {0}; int getnum () {
int num = 0;
char ch = getchar ();
int isneg = 0; while (! isdigit (ch)) {
if (ch == '-')
isneg = 1;
ch = getchar ();
}
while (isdigit (ch))
num = (num << 3) + (num << 1) + ch - '0', ch = getchar (); return isneg ? - num : num;
} int main () {
while (~ (N = getnum ())) {
M = getnum ();
memset (f, 0, sizeof (f));
for (int i = 1; i <= N; i ++) {
int vol = getnum (), value = getnum ();
int b = 0;
while (! (vol & 1))
vol >>= 1, b ++;
for (int j = 1000; j >= vol; j --)
f[b][j] = max (f[b][j], f[b][j - vol] + value);
}
int xm = M, maxb = 0;
while (xm)
xm >>= 1, maxb ++;
for (int i = 0; i <= maxb; i ++)
for (int j = 0; j <= 1000; j ++)
f[i][j] = max (f[i][j], f[i][j - 1]);
LL ans = 0;
for (int i = 1; i <= maxb; i ++)
for (int j = min (1000, M >> i); j >= 0; j --) // 注意此处上限是 min (100, M >> i),M >> i 保证不会将高位拿多了
for (int k = 0; k <= j; k ++) {
f[i][j] = max (f[i][j], f[i][j - k] + f[i - 1][min ((k << 1) + ((M >> (i - 1)) & 1), 1000)]);
ans = max (ans, f[i][j]);
}
printf ("%lld\n", ans);
} return 0;
} /*
4 10
8 9
5 8
4 6
2 5
-1 -1
*/ /*
4 10
8 9
5 8
4 6
2 5
4 13
8 9
5 8
4 6
2 5
16 75594681
393216 5533
2 77
32768 467
29360128 407840
112 68
24576 372
768 60
33554432 466099
16384 318
33554432 466090
2048 111
24576 350
9216 216
12582912 174768
16384 295
1024 76
-1 -1
*/

[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: 1057  Solved: 611[Submit][Stat ...

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

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

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

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

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

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

  6. 【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)

    bzoj1190,懒得复制,戳我戳我 Solution: 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子.啃了三天才懂. \(dp[i][j]\)表示背包容积为\(j*2^ ...

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

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

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

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

  9. [HNOI2007]梦幻岛宝珠

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

随机推荐

  1. Photoshop一些常用的快捷键

    1.按住Alt键,点击图层上的小眼睛,只显示当前图层 2.新建纯色图层,抠图 3.Fn+ num 调整不透明度 4.Shift + num 调整流量 5.调整图层透明度,在移动工具状态下,输入数字:0 ...

  2. meta-inf文件夹以及MANIFEST.MF文件的作用

    meta-inf相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序.扩展程序.类加载器和服务 manifest.mf文件,在用jar打包时自动生成的. META-I ...

  3. Threadlocal 传递参数(百度二面)

    去百度面试,二面的时候 面试官问 如果我想跟踪一个请求,从接收请求,处理到返回的整个流程,有没有好的办法,后来面试官说了 Threadlocal 可以做到传递参数. 这是ThreadLocal的一个功 ...

  4. 安装selenium和chromedriver

    网上找的算法,在运行爬虫代码时,需要Selenium+Phantomjs实现,我改成了用Selenium+Chrome:针对指定网址,自动打开浏览器,输入关键词搜索,并保存搜索的内容. 1. 安装se ...

  5. hdu 2586 How far away ?(LCA - Tarjan算法 离线 模板题)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. native2ascii -reverse -encoding UTF-8 validation_msg.properties > validation_msg_src.properties

    native2ascii -reverse -encoding UTF-8 validation_msg.properties > validation_msg_src.properties

  7. MT【96】一道三角恒等变换题

    设$a,b,c$是正数,且$(a+b)(b+c)(c+a)=8$,证明不等式:$\frac{a+b+c}{3}≥[\frac{a^3+b^3+c^3}{3}]^{\frac{1}{27}}$ 评:记住 ...

  8. 【刷题】BZOJ 3522 [Poi2014]Hotel

    Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了 ...

  9. Java实现的一个简单的模板渲染

    代码 package com.hdwang; import java.util.HashMap; import java.util.Map; /** * Created by hdwang on 20 ...

  10. bzoj 3195 [Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编 ...