bzoj1190,懒得复制,戳我戳我

Solution:

  • 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子。啃了三天才懂。
  • \(dp[i][j]\)表示背包容积为\(j*2^i\)时的最大价值。
  • 首先,因为每一个物品一定是\(a*2^b\),我们可以按照\(b\)值先按照普通的分组背包去做,处理出每个\(b\)值所对应的\(dp\)值
  • 然后我们就是要把这些\(dp\)值累积起来,选择每组最大显然不合适,因为有可能每个组都剩下空间,剩余空间累加起来的空间还可以放物品,我们采用一下\(dp\)方法:

\[dp[i][j] = max(dp[i][j] , dp[i][j-k]+dp[i-1][2*k+(w>>(i-1))])
\]

  • \(i\)表示次方,\(j\)表示系数,\(k\)表示让出多少位置给\(i-1\)次方
  • 我们次方从小(\(1\))枚举到大(\(W\)最高位),系数从大枚举到小,要保证\(i\)位上的最大价值是没有更新过得,也就是不包括前面位置(\(2^{i-1}\))的物品,然后加上上一层(\(i-1\))最大放的空间的\(dp\)值(因为空间最大,所以存的价值一定是最大的)
  • 另外还有一个小细节,我们要把前面预处理每组背包时处理到\(2\)倍,因为后面更新时,会把\(i\)层腾的空间传给\(i-1\)层,例如\(i\)层腾了\(k\)空间,也就是\(i-1\)层多有\(2*k\)的空间,再加上\(W\)里面\(i-1\)位的空间就是\(i-1\)的空间最大
  • 最后输出\(dp[cnt][1]\),\(cnt\)是最高位,因为是最高位,所以最高位上一定是\(1\)
  • 看得还是比较迷糊的,戳这里,这个博客讲的挺详细的
  • 好像\(HNOI2007\)的题目都好毒瘤23333……

Code:

//It is coded by Ning_Mew on 4.19
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int maxn=107; int n,cnt=0;
LL W,dp[maxn][2005],v,w; int main(){
while(1){
memset(dp,0,sizeof(dp));
scanf("%d%lld",&n,&W);
if(n==-1)break;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&w,&v);
cnt=0;
while(w%2==0)cnt++,w=w/2;
//cout<<"w:"<<cnt<<' '<<w<<endl;
for(int i=2000;i>=w;i--){
dp[cnt][i]=max(dp[cnt][i],dp[cnt][i-w]+v);
}
}
cnt=0;
for(int i=30;i>=0;i--)if((W>>i)&1){cnt=i;break;}
//cout<<"w:"<<cnt<<' '<<W<<endl;
for(int i=1;i<=cnt;i++){
for(int j=1000;j>=0;j--){
for(int k=0;k<=j;k++){
dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[i-1][2*k+((W>>(i-1))&1)]);
}
}
}
printf("%lld\n",dp[cnt][1]);
}
return 0;
}

【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)的更多相关文章

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

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

  2. bzoj1190 [HNOI2007]梦幻岛宝珠

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1190 [题解] 首先,我们把所有物品都分解成$a\times 2^b$的形式,然后把物品按 ...

  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. [HNOI2007]梦幻岛宝珠

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

随机推荐

  1. ASP.NET Core的Kestrel服务器(转载)

    Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库.ASP.NET Core模板项目使用Kestrel作为默认的web服务器.Kes ...

  2. MyBatis在Oracle中插入数据并返回主键的问题解决

    引言:  在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2   SQL Snipp ...

  3. vb6/ASP FORMAT MM/DD/YYYY

    VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关.意思是尽管你用诸如 F ...

  4. 2017-2018-4 20155203《网络对抗技术》Exp3 免杀原理与实践

    1.基础问题回答 (1)杀软是如何检测出恶意代码的? 分析恶意程序的行为特征,分析其代码流将其性质归类于恶意代码 (2)免杀是做什么? 使恶意代码避免被查杀,也就是要掩盖恶意代码的特征 (3)免杀的基 ...

  5. # 2017-2018-2 20155231《网络对抗技术》实验九: Web安全基础实践

    2017-2018-2 20155231<网络对抗技术>实验九: Web安全基础实践 实验要求: 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验内容: ( ...

  6. python 回溯法 子集树模板 系列 —— 17、找零问题

    问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元,要求硬币的个数最少,应该如何找零?或者指出该问题无解. 分析 元素--状态空间分析大法:四种面 ...

  7. Tengine 添加第三方监控模块nginx-module-vts

    一.概述 除nginx官网源码提供的各种模板,nginx还有第三方模块.官方文档中也列出了nginx的很多第三方模块,除官网之外,还有很多的有用的模块也能在Github上找到. 官网第三方模块地址:h ...

  8. libgdx判断actor与circle是否重叠

    实质是检测矩形与circle是否重叠 基本函数,判断点是否在circle中 public static boolean IsInside( float x, float y, Circle circl ...

  9. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...

  10. 原生 JavaScript 实现 AJAX、JSONP

    相信大多数前端开发者在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的 ...