关闭

[DP]BZOJ 1190——[HNOI2007]梦幻岛宝珠 动态规划]

标签: BZOJDP
461人阅读 评论(0) 收藏 举报
分类:

题目梗概

一个背包问题,但是有一些奇怪的条件。

背包大小<=230 N<=100

物品符合a2b(a<=10;b<=30)

题目梗概

把背包大小看成一个二进制数。

f[i][j]定义为前i位数,2i这位选择了j个大小。

枚举第i1位填k,显然剩下的jk都由第i位填满,所以可以得到转移方程f[i][j]=max(f[i][j],f[i][jk]+f[i1][min(2k+((w>>i1)&1),m)])

mi1的上限,因为a<=10,所以m=1000

这也是这么定义DP的好处,j,k的上限为m

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int m=1000;
int w,n,f[35][m+5],ans;
int main(){
    freopen("exam.in","r",stdin);
    freopen("exam.out","w",stdout);
    while(1){
        scanf("%d%d",&n,&w);
        if (n==-1&&w==-1) return 0;
        memset(f,0,sizeof(f));
        for (int i=1,a,x,b;i<=n;i++){
            scanf("%d%d",&a,&x);b=0;
            while(a%2==0) a>>=1,b++;
            for (int j=m;j>=a;j--) f[b][j]=max(f[b][j],f[b][j-a]+x);
        }
        ans=0;for (int j=0;j<=m;j++) ans=max(f[0][j],ans);
        for (int i=1;i<=30&&(1<<i)<=w;i++)
        for (int j=min(m,w>>i);j>=0;j--){
            for (int k=0;k<=j;k++) f[i][j]=max(f[i][j],f[i][j-k]+f[i-1][min(2*k+((w>>i-1)&1),m)]);
            ans=max(ans,f[i][j]);
        }
        printf("%d\n",ans);
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

BZOJ 1190 HNOI2007 梦幻岛宝珠 动态规划

题目大意:01背包,其中weight 直接背包肯定TLE+MLE 考虑到每个weight都能写成a*2^b的形式,显然我们要按照b分层来进行背包 令f[i][j]表示有j*2^i+(w&(1 ...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-02-26 15:50
  • 2148

非常好的动态规划总结,DP总结

总结的非常好,谢谢作者。 http://cppblog.com/menjitianya/archive/2015/10/23/212084.html 目录   一、动态规...
  • mmc2015
  • mmc2015
  • 2017-06-22 09:31
  • 2626

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢。   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15...
  • Scythe666
  • Scythe666
  • 2016-03-18 11:10
  • 2009

bzoj 1190: [HNOI2007]梦幻岛宝珠 动态规划

根据题意,很明显需要把a*2^b中b相同的先分成一组,然后首先得到这一组中的答案。        然后如果令f[m]表示当重量为m时的最大值,那么考虑将第k组加入其中,由于第k组的重量一定 AC代码如...
  • lych_cys
  • lych_cys
  • 2016-03-17 16:22
  • 910

[bzoj1190][HNOI2007]梦幻岛宝珠 分组背包

我读的书愈多,就愈亲近世界,愈明了生活的意义,愈觉得生活的重要。
  • youhavepeople
  • youhavepeople
  • 2017-06-05 10:47
  • 248

BZOJ 1190 梦幻岛宝珠 [01背包][二进制优化]

题目中wi=a∗2bw_i=a*2^b的提示太明显了吧。。 以这个为线索,跑裸的01会TLE,但是通过将相同的bb归纳在一个w[]w[]中的话,就可以在较优的复杂度内求得答案。 数组开小了WA了几...
  • lemonoil
  • lemonoil
  • 2017-07-13 17:21
  • 270

bzoj1190梦幻岛宝珠

Description 给你N颗宝石,每颗宝石都有重量和价值。要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值。数据范围:N Input 输入文件...
  • lzr010506
  • lzr010506
  • 2016-01-19 14:32
  • 469

分层背包 [HNOI2007]梦幻岛宝珠

问题 I: [HNOI2007]梦幻岛宝珠 时间限制: 1 Sec 内存限制: 162 MB 提交: 32 解决: 6 [提交][状态][讨论版] 题目描述 给你N颗宝石,每颗宝石都有重...
  • QTY2001
  • QTY2001
  • 2017-10-18 20:23
  • 353

bzoj 1010: [HNOI2008] 玩具装箱 toy [斜率优化dp] [动态规划]

1010: [HNOI2008]玩具装箱toyTime Limit: 1 Sec Memory Limit: 162 MB Submit: 9202 Solved: 3678Descriptio...
  • ourfutr2330
  • ourfutr2330
  • 2016-08-25 20:50
  • 1213

【bzoj4011】【hnoi2015】落忆枫音【精妙的动态规划】

我最近越来越感觉到我弱爆了。 今天下午全机房做hnoiD2,但是我只会敲暴力……第二题看着像点分治,可是我不会写~ 看来多做题确实是真理~ 这道题精妙极了! 引用一段PoPoQQQ大神的话: ...
  • ZMOIYNLP
  • ZMOIYNLP
  • 2015-04-26 20:50
  • 1563
    个人资料
    • 访问:62107次
    • 积分:2275
    • 等级:
    • 排名:第19013名
    • 原创:157篇
    • 转载:1篇
    • 译文:0篇
    • 评论:48条
    我的日记
    博客专栏