首页 > 其他分享 > [HNOI2007]梦幻岛宝珠

[HNOI2007]梦幻岛宝珠

时间:2023-01-18 22:45:11浏览次数:53  
标签:10 梦幻岛 int res maxw while 宝珠 HNOI2007

题意:01背包,但空间巨大。

观察到每个 w_iwi​ 能写成 a * 2^b (a,b∈N) 的形式,于是可以先把b相同的宝珠做一次合并,随后再进行总的合并。

b相同的宝珠合并时直接可以使用01背包来转移,而总的合并比较复杂,可以采用数位dp的思想用g[i][j]来表示第i位为j,0~i-1位为m&((1<<i)-1)时的最大价值,然后j可以从i-1位进位得到,枚举进位k,转移方程为

g[i][j]=max(g[i][j],f[i][j-k]+g[i-1][min(10*n,2*k+(maxw>>((i-1))&1))]);

注意j上界为10*n

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[31][1010],g[31][1010],cnt=0;
int n,maxw;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    while(cin>>n>>maxw)
    {
        if(n==-1)break;
        memset(f,0,sizeof(f));
        memset(g,0,sizeof(g));
        for(register int i=1,w,v;i<=n;++i)
        {
            cin>>w>>v;
            int res=0;
            while(!(w&1))w>>=1,res++;
            for(int j=10*n;j>=w;--j)f[res][j]=max(f[res][j],f[res][j-w]+v);
        }
        cnt=0;
        while(maxw>=1<<cnt+1)cnt++;
        memcpy(g[0],f[0],sizeof(g[0]));
        for(register int i=1;i<=cnt;++i)
            for(register int j=0;j<=10*n;++j)
                for(register int k=0;k<=j;++k)
                g[i][j]=max(g[i][j],f[i][j-k]+g[i-1][min(10*n,2*k+(maxw>>((i-1))&1))]);
        cout<<g[cnt][1]<<endl;
    }
    return 0;
}

 

标签:10,梦幻岛,int,res,maxw,while,宝珠,HNOI2007
From: https://www.cnblogs.com/zimersblog/p/17060789.html

相关文章

  • P3188 [HNOI2007]梦幻岛宝珠 题解
    一道不错的dp题,下令原背包容量为\(m\)。注意到\(w_i=a\times2^b\)中\(a,b\)都比较小,尝试按照\(a\)或者\(b\)分组然后合并,但是显然如果我们按照\(a\)分组就......
  • BZOJ 1185([HNOI2007]最小矩形覆盖-旋转卡壳+点集几何意义)
    1185:[HNOI2007]最小矩形覆盖TimeLimit: 10Sec  MemoryLimit: 162MBSec  SpecialJudgeSubmit: 258  Solved: 137Description l要事先改成......
  • BZOJ 1189([HNOI2007]紧急疏散evacuate-网络流二分+拆点)
    发生了火警,所有人员需要紧急疏散!假设每个房间是一个NM的矩形区域。每个格子如果是’.’,那么表示这是一块空地;如果是’X’,那么表示这是一面墙,如果是’D’,那么表示这是一扇门......
  • [HNOI2007]紧急疏散EVACUATE
    题目传送门:[HNOI2007]紧急疏散EVACUATEbfs+二分+最大流#include<queue>#include<string>#include<cstdio>#include<cstring>#include<algorithm>constintN=2......
  • 数位dp P3188 [HNOI2007]梦幻岛宝珠-Solution
    数位考虑+背包(+滚动数组)首先,我们能发现,这是一道\(n\)很小但是体积和权值都非常大的背包。但是这个题的体积有一个特殊的性质,就是他是\(a\times2^b,a\leq10\)的形......