BZOJ 1190 [HNOI2007]梦幻岛宝珠(背包)
1190: [HNOI2007]梦幻岛宝珠
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1385 Solved: 798
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
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
Sample Output
19
1050650
HINT
思路
设dp[i][j]为空间为i*2^(j+1)可以获取的最大价值。
然后对于每一层(也就是每一个j)用相同的j的物品做01背包。
然后考虑跨层怎么转移。
dp[i][j]=max(dp[i][j],dp[i-k][j]+dp[k*2+((m>>(j-1))&1)]);
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,dp[][];
int main(){
while(scanf("%d%d",&n,&m)){
if(n==-&&m==-)break;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
int w,v;
scanf("%d%d",&w,&v);
int cnt=;
while(w%==){
cnt++;
w/=;
}
for(int j=;j>=w;j--){
dp[j][cnt]=max(dp[j][cnt],dp[j-w][cnt]+v);
}
}
int top=;
int hh=m;
while(hh){
hh/=;
top++;
}
top--;
for(int i=;i<=top;i++)
for(int j=;j>=;j--)
for(int k=;k<=j;k++){
dp[j][i]=max(dp[j][i],dp[j-k][i]+dp[min(,k*+((m>>(i-))&))][i-]);
}
printf("%d\n",dp[][top]);
}
return ;
}
BZOJ 1190 [HNOI2007]梦幻岛宝珠(背包)的更多相关文章
- [BZOJ 1190][HNOI2007]梦幻岛宝珠
1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1057 Solved: 611[Submit][Stat ...
- BZOJ.1190.[HNOI2007]梦幻岛宝珠(分层背包DP)
题目链接 把重量表示为\(a\times2^b\)的形式,然后按\(b\)排序. 从高到低枚举每一位,\(f[i]\)表示当前位容量为\(i\)时的最大价值(容量即\(a\times2^{bit}\) ...
- 1190: [HNOI2007]梦幻岛宝珠 - BZOJ
Description 给你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}\),那么不妨 ...
- [HNOI2007]梦幻岛宝珠(背包)
给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30,并且保证每颗宝石的重量符 ...
- 【bzoj 1190】梦幻岛宝珠(DP)
这题是在01背包问题的基础上,扩充了重量,需要用时间换空间. 思路: 1.仔细看题,注意到重量wi为a*2^b(a<=10,b<=30),很容易想到要按 b 分开做背包的DP.接下来的重点 ...
- 【BZOJ1190】[HNOI2007]梦幻岛宝珠 分层背包DP
[BZOJ1190][HNOI2007]梦幻岛宝珠 Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. ...
- luogu 3188 [HNOI2007]梦幻岛宝珠
LINK:梦幻岛宝珠 时隔多日 我再次挑战这道题.还是以失败告终. 我觉得这一道背包真的有点难度 这是一个数量较少 但是价值和体积较大的背包. 通常的01背包 要不就是体积小 要么是价值小 但这道题给 ...
- 【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)
bzoj1190,懒得复制,戳我戳我 Solution: 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子.啃了三天才懂. \(dp[i][j]\)表示背包容积为\(j*2^ ...
随机推荐
- Python-基础-day5
1.内置函数 2.文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open ...
- 2019-03-15 使用Request POST获取中加基金的PDF文件,并下载到本地
import requests import time base_url='http://www.bobbns.com/common-web/cms/content!getContentsInclud ...
- where和having
where可以不能使用别名作为过滤条件,而having可以使用别名作为过滤条件. 在ORACLE中,select 语句的执行顺序是: 1. from语句 2. where语句(结合条件) 3. sta ...
- promise的原理
promise的原理 一旦状态改变,就不会再变,任何时候都可以得到这个结果.Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 re ...
- jquery中的jsonp跨域调用
jquery jsonp跨域调用接口
- MgdDbg工具
ArxDbg是可以查看AutoCAD内部数据结构的工具,可惜是C++的.从网上找到了一个.NET版本的MgdDbg,实现的功能与C++版本的差不多. 1.运行程序,你只要右键点击AutoCAD窗口,在 ...
- 不用while if 循环求 1到n的和,还用到了!!这样的运算符
很好的题目.开始我也没有想出来. 不用while if 循环求 1到n的和 给了很多种解法,第一种是构造函数,然后累加static变量 第二种是虚函数,有父类子类,父类的结束,然后用 !!n来让 n不 ...
- 保留全部Android crash信息
保留全部Android crash信息 framework/base/core/java/com/android/internal/os/RuntimeInit.java 又一次以下这个函数,增加自己 ...
- 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)
一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预 ...
- python抓取新浪微博评论并分析
1,实现效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2xhbnphbw==/font/5a6L5L2T/fontsize/400/fill ...