bzoj1190 [HNOI2007]梦幻岛宝珠
传送门: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]梦幻岛宝珠的更多相关文章
- 【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)
bzoj1190,懒得复制,戳我戳我 Solution: 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子.啃了三天才懂. \(dp[i][j]\)表示背包容积为\(j*2^ ...
- bzoj1190 [HNOI2007]梦幻岛宝珠 动态规划
给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符 ...
- bzoj1190 [HNOI2007]梦幻岛宝珠 背包
题目 https://lydsy.com/JudgeOnline/problem.php?id=1190 题解 好神仙的一道题啊. 既然 \(w_i = a_i\cdot 2^{b_i}\),那么不妨 ...
- 【BZOJ1190】[HNOI2007]梦幻岛宝珠 分层背包DP
[BZOJ1190][HNOI2007]梦幻岛宝珠 Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. ...
- [BZOJ 1190][HNOI2007]梦幻岛宝珠
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1057 Solved: 611[Submit][Stat ...
- BZOJ 1190 [HNOI2007]梦幻岛宝珠(背包)
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1385 Solved: 798[Submit][Stat ...
- luogu 3188 [HNOI2007]梦幻岛宝珠
LINK:梦幻岛宝珠 时隔多日 我再次挑战这道题.还是以失败告终. 我觉得这一道背包真的有点难度 这是一个数量较少 但是价值和体积较大的背包. 通常的01背包 要不就是体积小 要么是价值小 但这道题给 ...
- BZOJ1190[HNOI2007]梦幻岛宝石
Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30, ...
- 1190: [HNOI2007]梦幻岛宝珠 - BZOJ
Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. 数据范围:N<=100;W<=2^30 ...
随机推荐
- 带复杂类的list,list<class>前台往后台传输
1.前台 $("#applyGoods").click(function(){ var usid=$(this).next().text(); var aid=$(this).ne ...
- Window下Neo4j安装教程
一.neo4j 介绍 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储 ...
- Java VM 环境配置过程要点( win10,64位)
好些教程写的都不一样.留个脚印免得以后再安装的时候找不到完全合适的教程. 注:JDk中就有java虚拟机,即JRE.除此之外,还有许多的命令包,供java程序员使用. 安装要点: (1)安装jre(j ...
- hdu 4576 (简单dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率.(1 ...
- SSL证书部署
SSL证书部署指南 https://www.trustauth.cn/ssl-guide
- Codeforces 1060 F. Shrinking Tree
题目链接 一道思维好题啊...感觉这种类型的题很检验基本功是否扎实(像我这样的就挂了). 题意:你有一棵\(n\)个点的树,每次随机选择一条边,将这条边的两个端点合并,并随机继承两个点标号中的一个,问 ...
- jmeter函数
1.常用JMeter函数 1)__regexFunction 正则表达式函数可以使用正则表达式(用户提供的)来解析前面的服务器响应(或者是某个变量值).函数会返回一个有模板的字符串,其中携带有可变的值 ...
- NOIP赛前集训营-提高组(第一场)#B 数数字
题目描述 小N对于数字的大小一直都有两种看法.第一种看法是,使用字典序的大小(也就是我们常用的判断数字大小的方法,假如比较的数字长度不同,则在较短一个前面补齐前导0,再比较字典序),比如43<3 ...
- 【bzoj3209】 花神的数论题
http://www.lydsy.com/JudgeOnline/problem.php?id=3209 (题目链接) 题意 ${sum(i)}$表示${i}$的二进制表示中${1}$的个数.求${\ ...
- 压测工具-Jmeter
server压力测试首选: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 1 JMet ...