传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1190

【题解】

首先,我们把所有物品都分解成$a\times 2^b$的形式,然后把物品按照$b$分组;

我们按$b$从高到低考虑。$f(i,j)$表示考虑到$2^i$,当前还剩余$j\times 2^i$的空间,所能取到的最大值。

每层先从上一层传递$f$数组,然后再更新。每次就是一个背包转移了。

考虑这个$j$可能随着$b$减小越来越大,我们需要优化。

对于每一层的物品,最多只能表示成$na\times 2^b$的形式,即最多$1000 \times 2^b$。

所以对于上一层传下来的值,如果它乘了2之后大于1000,实际上这些多于1000的部分是没有用的,我们可以直接舍弃!

这样的话就能保证复杂度了!

# include <vector>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int M = 5e5 + ;
const int mod = 1e9 + ; int n, W; vector<int> w[], v[];
ll f[][];
int to[]; bool Main() {
cin >> n >> W;
if(n == - && W == -) return ;
for (int j=; j<=; ++j) {
w[j].clear(), v[j].clear(), to[j] = ;
for (int i=; i<=; ++i) f[j][i] = ;
}
for (int j=; j<=n; ++j) {
int ww, vv;
cin >> ww >> vv;
for (int i=; ~i; --i) {
if(ww % ( << i) == ) {
w[i].push_back(ww / ( << i));
v[i].push_back(vv);
break;
}
}
} for (int j=, curW=; ~j; --j) {
bool flag = ;
to[j] = to[j+] * ;
if(W & (<<j)) flag = , to[j] ++; if(to[j] <= ) {
for (int i=; i<=to[j]; ++i)
if(flag == ) {
if(i% == ) f[j][i] = f[j+][i/];
} else if(i% == ) f[j][i] = f[j+][i/];
} else {
for (int i=; i<=; ++i)
if(flag == ) {
if(i% == ) f[j][i] = f[j+][i/];
} else if(i% == ) f[j][i] = f[j+][i/];
for (int i=; i<=to[j+]; ++i)
f[j][] = max(f[j][], f[j+][i]);
to[j] = ;
} for (int k=, kto = w[j].size(); k<kto; ++k) {
for (int i=; i<=to[j]; ++i) {
int tw = w[j][k], tv = v[j][k];
if(i - tw >= ) f[j][i-tw] = max(f[j][i-tw], f[j][i]+tv);
}
} } ll ans = ;
for (int i=to[]; ~i; --i) ans = max(ans, f[][i]);
cout << ans << endl;
return ;
} int main() {
while(Main());
return ;
}

bzoj1190 [HNOI2007]梦幻岛宝珠的更多相关文章

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

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

  2. bzoj1190 [HNOI2007]梦幻岛宝珠 动态规划

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ1190[HNOI2007]梦幻岛宝石

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

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

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

随机推荐

  1. debug阶段贡献分

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:11.29 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成 ...

  2. PHP 常用函数总结(一)

    重点: 看函数的 ‘参数’ 和 ‘返回值’ 文档:http://www.w3school.com.cn/php/php_ref_array.asp http://www.w3school.com.cn ...

  3. Centos7 FPM 安装mysql8

    参考http://tn.51cto.com/article/647 http://www.jb51.net/article/138787.htm 转载: 卸载centos自带的mariadb rpm ...

  4. [转帖]紧急预警:Globelmposter3.0变种来袭,多行业中招

    紧急预警:Globelmposter3.0变种来袭,多行业中招 https://www.csdn.net/article/a/2018-09-04/15959658   CSDN 转载深信服...   ...

  5. yii框架 excel导出

    环境: yii框架 basic版 1.下载 PHPexcel  (我用的是PHPExcel-1.8.1) 2.将下载的文件夹 (PHPExcel-1.8.1)放至 vender下  (路径:basic ...

  6. mysql索引的优化

    MySQL索引的优化 上面都在说使用索引的好处,但过多的使用索引将会造成滥用.因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT.UPDATE和DEL ...

  7. BZOJ5101 POI2018Powódź(并查集)

    如果某个格子的积水量超过了该格子的某个挡板高度,那么挡板另一端的积水量就会与其相同.看起来是一个不断合并的过程,考虑并查集.枚举深度,维护每个连通块内的方案数,深度超过某挡板高度时,将两端的连通块合并 ...

  8. vue element 新增、编辑类Dialog公用函数

    调用 <el-button type="primary" class="my-button" size="small" :loadin ...

  9. Finding LCM LightOJ - 1215 (水题)

    这题和这题一样......只不过多了个数... Finding LCM LightOJ - 1215 https://www.cnblogs.com/WTSRUVF/p/9316412.html #i ...

  10. Vue使用SCSS进行模块化开发

    原文地址:http://www.cnblogs.com/JimmyBright/p/7761531.html 个人认为scss最大的好处就是能将css属性设置为变量,这样让css一键更换主题成为可能. ...