Description

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

Input

输入文件中包含多组数据。每组数据的格式如下:第一行是两个正整数n和W,1≤n≤100,1≤W≤2^30,分别表示宝石的数目和最多能带走的宝石重量。接下来的n行,每行有两个正整数weighti和valuei,1≤weighti≤2^30, 0≤valuei≤2^30,分别表示第i颗宝石的重量和价值,且保证weighti能写成a*2^b(1≤a≤10,0≤b≤30)的形式。同一行的两个正整数之间用空格隔开。最后一组数据的后面有两个-1,表示文件的结束。这两个-1并不代表一组数据,你不需对这组数据输出结果。并且输入文件中数据的组数不超过20。

Output

对于输入的每组数据,输出一个整数C,表示小P最多能带走的宝石的总价值。每个结果整数C单独占一行,且保证C不会超过2^30。

Sample Input

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

Sample Output

14
19
1050650
 

题解:

显然这是一个01背包,但是体积容积都特别大。

事实上,每颗宝石体积在2进制情况下的有效位数都特别有限,可以对体积按位dp。

F[i,j]表示当前DP到第i位,使用j*2^(i-1)体积可以得到的最大价值。对于i的阶段,只要用b=i-1的宝石去DP,然后进位转移到下一阶段。

因为a<=10,n<=100,j最多为1000。

注意考虑上界,需额外开一个数组表示所考虑有效位数之后的数都在W对应范围内的情况。

代码:

 uses math;
var
i,j,k,l,n,m,ii,ww:longint;
tot,w:int64;
a:array[..,..,..]of int64;
s:array[..]of longint;
b:array[..,..]of int64;
t:array[..]of int64;
begin
while true do
begin
readln(n,w); tot:=;
//w:=;
if n=- then break;
for i:= to n do
begin
readln(b[i,],b[i,]);
b[i,]:=;
while b[i,] mod = do begin b[i,]:=b[i,] div ; inc(b[i,]); end;
end;
for i:= to n- do
for j:=i+ to n do
if b[i,]>b[j,] then begin t:=b[i]; b[i]:=b[j]; b[j]:=t; end;
fillchar(a,sizeof(a),);
if n=- then break;
l:=;
while w> do
begin
inc(l); s[l]:=w mod ;
w:=w div ;
end;
ii:=;
for i:= to l do
begin
for j:= to do
if(s[i-]=)or(j mod =)then
begin
a[,i,j div ]:=max(a[,i,j div ],a[,i-,j]);
a[,i,j div ]:=max(a[,i,j div ],a[,i-,j]);
end;
for j:= to do
begin
a[,i,(j div )+]:=max(a[,i,(j div )+],a[,i-,j]);
if j mod = then
a[,i,j div ]:=max(a[,i,j div ],a[,i-,j]);
end;
while(ii<=n)and(b[ii,]<=i)do
begin
for j:=-b[ii,] downto do
begin
a[,i,j+b[ii,]]:=max(a[,i,j+b[ii,]],a[,i,j]+b[ii,]);
a[,i,j+b[ii,]]:=max(a[,i,j+b[ii,]],a[,i,j]+b[ii,]);
end;
inc(ii);
end;
for j:= to do begin a[,i,j]:=max(a[,i,j],a[,i,j-]);
a[,i,j]:=max(a[,i,j-],a[,i,j]); end;
end;
writeln(max(a[,l,],a[,l,]));
end;
end.

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://www.lydsy.com/JudgeOnline/problem.php?id=1190 [题解] 首先,我们把所有物品都分解成$a\times 2^b$的形式,然后把物品按 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Spring Boot中静态资源(JS, 图片)等应该放在什么位置

    Spring Boot的静态资源,比如图片应该放在什么位置呢, 如果你放在传统WEB共的类似地方, 比如webapp或者WEB-INF下,你会得到一张示意文件未找到的破碎图片.那应该放哪里呢? 百度一 ...

  2. C标准头文件<string.h>

    里面主要包含了一些与字符串关联的函数的声明,这些函数有如下的命名规则: 以"mem"开头的函数操作任意的字符序列 以"strn"开头的函数操作非空字符序列 以& ...

  3. java多线程-读写锁

    Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...

  4. box-sizing重置盒子模型计算规则

    目标大纲 一.语法声明 box-sizing : content-box | border-box | inherit 二.属性值说明 content-box 在宽度和高度之外绘制元素的内边距和边框 ...

  5. 2-1 git合并 打tag

    tag常用命令(仅供参考): git tag -a V1.4 -m "1.4" 创建一个tag git tag 查看本地tag git tag -d V1.1  删除本地tag g ...

  6. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十)态势标绘模块

    config.xml文件的配置如下: <widget label="态势标绘" icon="assets/images/impact_area_over.png&q ...

  7. Objective-C 工厂方法

    类方法用来创建对象的方法就是工厂方法 1.无参工厂方法 创建对象,并给属性一个默认值. //无参工厂方法实现 +(Student*)student{ return [[Student alloc]in ...

  8. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

  9. SharePoint 2013 使用JavaScript对象模型配置智能提示

    前言 默认在VS2012/2013中编写SharePoint JavaScript 客户端对象模型,都没有智能感知的功能,用起来非常麻烦:其实,我们可以手动配置一下,让JavaScript可以进行智能 ...

  10. View and Data API tips: 缓存Access Token

    对于云API服务,常见的方式就是按照API调用次数收费,某些API调用也就有某些限制,比如在特定时间内只允许调用指定的次数以免造成滥用.虽然Autodesk的view and Data API目前还没 ...