P4095 [HEOI2013]Eden 的新背包问题

题解

既然假定第 i 个物品不可以选,那么我们就设置两个数组

dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 j 的最大价值

然后正着反着跑 多重背包

最后答案考虑 i 之前的物品的价格和  i 之后的物品的价格,转移如下:

代码

#include<bits/stdc++.h>

using namespace std;

inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,q,d,e,ans=;
int dpl[][],dpr[][];
//dpl[][]正序选前i个物品,dpr[][]倒序选前i个物品
struct node{
int a,b,c;
}thing[]; void pre() //多重背包
{
for(int i=;i<=n;i++) //正序背包
{
for(int j=;j<=;j++) dpl[i][j]=dpl[i-][j];
int x=,z=thing[i].c ;
while(x<=z){
for(int k=;k>=thing[i].a *x;k--)
dpl[i][k]=max(dpl[i][k],dpl[i][k-thing[i].a *x]+thing[i].b *x);
z-=x;
x<<=;
}if(z){
for(int k=;k>=thing[i].a *z;k--)
dpl[i][k]=max(dpl[i][k],dpl[i][k-thing[i].a *z]+thing[i].b *z);
}
}
for(int i=n;i>=;i--) //倒序背包
{
for(int j=;j<=;j++) dpr[i][j]=dpr[i+][j];
int x=,z=thing[i].c ;
while(x<=z){
for(int k=;k>=thing[i].a *x;k--)
dpr[i][k]=max(dpr[i][k],dpr[i][k-thing[i].a *x]+thing[i].b *x);
z-=x;
x<<=;
}if(z){
for(int k=;k>=thing[i].a *z;k--)
dpr[i][k]=max(dpr[i][k],dpr[i][k-thing[i].a *z]+thing[i].b *z);
}
}
} int main()
{
n=read();
for(int i=;i<=n;i++)
thing[i].a =read(),thing[i].b =read(),thing[i].c =read();
pre();
q=read();
for(int i=;i<=q;i++)
{
d=read()+; //输入编号是从0开始的
e=read();ans=;
for(int j=;j<=e;j++)
ans=max(ans,dpl[d-][j]+dpr[d+][e-j]);
printf("%d\n",ans);
}
return ;
}

后面附上听课笔记:

◦ N个物品,第i个物品有c[i]个,购买第i个物品需要a[i]元,可获利b[i]的价
值。有m个询问,每次询问:如果第x个物品禁止购买,你有y元的话,能
获得的最大价值是多少?询问之间互相独立。
◦ N<=1000,m<=3*10^5 
>Solution

这是一个经典的问题
◦ 分治+背包
◦ 初始solve(1,n)
◦ 递归的函数到Solve(l,r),维护的dp数组,记录的是除去[l,r]外的物品的构成的背
包数组。
◦ Solve(l,mid)时,把[mid+1,r]内的物品加入dp数组。
◦ 我们这里定义的加入这个物品u,就是多考虑上这个物品之后构成的dp数组。
若是0/1背包的加入也就是做以下这个操作。
◦ For (int i=n;i>=w[u];i--) dp[i]=max(dp[i],dp[i-w[u]]+v[u]);
◦ 当l=r时,将对应所有的询问在dp数组查询即可。
◦ 单调队列优化的话,复杂度O(n*m*log(n)),每个物品被加进去log次,每次O(m)

代码实现

。由于你要分治求解,所以d表示深度

对于每次询问,ans得到答案,id[i]表示询问编号,S[i]表示题目所给出的y

。由于是分治,所以每次都先复制一遍再传递下去

◦ Insert(dp,i):是在dp数组当中加入i号物品。

全部代码:

P4095 [HEOI2013]Eden 的新背包问题的更多相关文章

  1. luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并

    LINK:Eden 的新背包问题 就是一个多重背包 每次去掉一个物品 询问钱数为w所能买到的最大值. 可以对于每次Q暴力dp 利用单调队列优化多重背包 这样复杂度是Qnm的. 发现过不了n==10的点 ...

  2. LUOGU P4095 [HEOI2013]Eden 的新背包问题

    题目描述 " 寄 没 有 地 址 的 信 ,这 样 的 情 绪 有 种 距 离 ,你 放 着 谁 的 歌 曲 ,是 怎 样 的 心 情 . 能 不 能 说 给 我 听 ." 失忆的 ...

  3. 题解——洛谷P4095 [HEOI2013]Eden 的新背包问题(背包)

    思路很妙的背包 用了一些前缀和的思想 去掉了一个物品,我们可以从前i-1个和后i+1个推出答案 奇妙的思路 #include <cstdio> #include <algorithm ...

  4. Luogu P4095 [HEOI2013]Eden 的新背包问题 思维/动规

    当时一直在想前缀和...多亏张队提醒... 从1到n背次包,保存每一个状态下的价值,就是不要把第一维压掉:再从n到1背一次,同样记住每种状态: 然后询问时相当于是max(前缀+后缀),当然前缀后缀中间 ...

  5. Luogu P4095 [HEOI2013]Eden的新背包问题

    题目 求出从前往后的背包\(f_{i,j}\)和从后往前的背包\(F_{i,j}\). 那么对于询问\((d,e)\),答案就是\(\max\limits_{i=0}^e f_{d-1,i}+F_{d ...

  6. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  7. BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]

    3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 277[Submit][ ...

  8. 洛谷P4095||bzoj3163 [HEOI2013]Eden 的新背包问题

    https://www.luogu.org/problemnew/show/P4095 不太会.. 网上有神奇的做法: 第一种其实是暴力(复杂度3e8...)然而可以A.考虑多重背包,发现没有办法快速 ...

  9. bzoj 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

随机推荐

  1. 如何在调用Marketing Cloud contact创建API时增加对扩展字段的支持

    需求:扩展字段"微信ID"是我创建出来的extension field,我想用Marketing Cloud提供的contact creation API,在创建contact时也 ...

  2. [转]TCP的三次握手与四次挥手

    TCP的概述 TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 ...

  3. Linux 虚拟机扩容

    由于在装软件,原来的20G空间不够使用,需要扩容操作. 1.关闭虚拟机 2.点击编辑虚拟机设置 选中硬盘,添加,硬盘,推荐,确定大小,完成. 2.启动虚拟机 查看磁盘使用情况: [root@maste ...

  4. 多线程理论———— threading

    什么是线程 线程也是一种多任务编程方法,可以利用计算机多核资源完成程序的并发执行.线程又被称为轻量级的进程.线程的特征 * 线程是计算机多核分配的最小单位 * 一个进程可以包含多个线程 * 线程也是一 ...

  5. MySQL实例多库某张表数据文件损坏导致xxx库无法访问故障恢复

    一.问题发现 命令行进入数据库实例手动给某张表进行alter操作,发现如下报错. mysql> use xx_xxx; No connection. Trying to reconnect... ...

  6. idou老师教你学Istio05: 如何用Isito实现智能路由配置

    要介绍istio请求路由,我们不由得先从pilot 和 envoy开始谈起. 在服务网格中,Pilot管理和配置所有的envoy实例.在pilot中,你几乎可以配置所有的关于流量导向规则及其他故障恢复 ...

  7. 面试题——常见的gc算法有哪些?

    常见的gc算法有哪些? java garbage collection是一个自动进程,用于管理程序使用的运行时内存.通过自动执行JVM,可以减轻程序中分配和释放内存资源的开销. 垃圾回收机制是由垃圾回 ...

  8. h5 特效

    地址:http://www.cnblogs.com/sun927/p/5842852.html 几个别人总结的css3炫酷效果,有需要直接拿来用即可,包括以下几个效果: 1.悬浮时放大 2.悬浮时转一 ...

  9. Java调用和回调总结(2)

    Java调用和回调总结(2) 调用的种类 调用有3种, 普通调用(同步调用), 异步调用, 异步回调. 三种调用的特点 普通调用: 也叫做同步调用 , 最常见的调用, 会造成阻塞. 异步调用 : 异步 ...

  10. P3377 【模板】左偏树(可并堆) 左偏树浅谈

    因为也是昨天刚接触左偏树,从头理解,如有不慎之处,跪请指教. 左偏树: 什 么是(fzy说)左偏树啊? 前置知识: 左偏树中dist:表示到右叶点(就是一直往右下找,最后一个)的距离,特别的,无右节点 ...