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. PHP封装curl的调用接口及常用函数

    <?php /** * @desc 封装curl的调用接口,post的请求方式 */ function doCurlPostRequest($url, $requestString, $time ...

  2. UWP-开发一个具有闹钟,天气预报,翻译,语音功能的Demo

    UWP即Windows 10中的Universal Windows Platform简称.即Windows通用应用平台,在Windows 10 Mobile/Surface(Windows平板电脑)/ ...

  3. 利用RMAN转移裸设备到文件系统

    本文只是为了个人备忘. 参考eagyle的:http://www.eygle.com/archives/2005/12/oracle_howto_move_datafile_raw.html 我首先挂 ...

  4. 汇编 MOV -2

    知识点:  MOV指令  基址  内联汇编  把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...

  5. vs编译器好多下划波浪线但不报错

    解决办法:项目属性->c/c++->常规->附加包含目录->$(ProjectDir): $(ProjectDir) 项目的目录(定义形式:驱动器 + 路径):包括尾部的反斜杠 ...

  6. vue-cli 3.0 实现A-Z字母滑动选择城市列表

    项目地址: https://github.com/caochangkui/vue-cli3 项目代码: 城市列表首页: City.vue <template> <div id=&qu ...

  7. SpringBoot整合EHcache学习笔记

    为了提高系统的运行效率,引入缓存机制,减少数据库访问和磁盘IO.下面说明一下ehcache和SpringBoot整合配置 前言介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特 ...

  8. JavaScript快速入门-ECMAScript本地对象(Date)

    JavaScript中的Date 对象用于处理日期和时间. var myDate=new Date()  #Date 对象会自动把当前日期和时间保存为其初始值. 一.Date对象的方法 方法 示例 n ...

  9. sonarqube扫描安卓代码

    代码才用https://github.com/liwanlei/bilibili-android-client 配置: build.gralde配置 buildscript { repositorie ...

  10. Jq_input file标签上传图片到服务器

    引入jQuery库引入ajaxfileupload.js上传插件库(这也是jQuery的一个插件)以ASP.NET为例 <input type="file" id=" ...