Description

“寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听。”
失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她的音容笑貌。 记忆中,她总是喜欢给Eden出谜题:在 valentine’s day 的夜晚,两人在闹市中闲逛时,望着礼品店里精巧玲珑的各式玩偶,她突发奇想,问了 Eden这样的一个问题:有n个玩偶,每个玩偶有对应的价值、价钱,每个玩偶都可以被买有限次,在携带的价钱m固定的情况下,如何选择买哪些玩偶以及每个玩偶买多少个,才能使得选择的玩偶总价钱不超过m,且价值和最大。众所周知的,这是一个很经典的多重背包问题,Eden很快解决了,不过她似乎因为自己的问题被飞快解决感到了一丝不高兴,于是她希望把问题加难:多次 询问,每次询问都将给出新的总价钱,并且会去掉某个玩偶(即这个玩偶不能被选择),再问此时的多重背包的答案(即前一段所叙述的问题)。  
这下Eden 犯难了,不过Eden不希望自己被难住,你能帮帮他么?

Input

第一行一个数n,表示有n个玩偶,玩偶从0开始编号 
第二行开始后面的 n行,每行三个数 ai, bi, c i,分别表示买一个第i个玩偶需
要的价钱,获得的价值以及第i个玩偶的限购次数。 
接下来的一行为q,表示询问次数。 
接下来q行,每行两个数di. ei表示每个询问去掉的是哪个玩偶(注意玩偶从0开始编号)以及该询问对应的新的总价钱数。(去掉操作不保留,即不同询问互相独立)

Output

输出q行,第i行输出对于第 i个询问的答案。

Sample Input

5
2 3 4
1 2 1
4 1 2
2 1 1
3 2 3
5
1 10
2 7
3 4
4 8
0 5

Sample Output

13
11
6
12
4
首先,如果不考虑多次询问和去掉某个玩偶,这是一个多重背包,将其转化为01背包再加上二进制优化,否则会炸内存。然后我们在考虑多个容量和去掉的问题,当去掉某个玩偶k后,相当于在1~k-1和k+1~n中做背包,那么需要倒着做一个正着做一个,也就是变为简单的01背包做两遍。最后询问时要枚举k两边的背包容量如何分配。不能压缩为一维数组。
PS:这题输入输出如果用cin,cout平台上就会显示RE,不知道为什么……
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstdlib>
 4 using namespace std;
 5 int f[10010][1010]={0},f2[10010][1010]={0},a[1111]={0},b[1111]={0},c[1111]={0},d[300005]={0},e[300005]={0},v[10010]={0},w[10010]={0};
 6 int s[1111]={0};
 7 int main()
 8 {
 9     int n=0,q=0,tot;
10     scanf("%d",&n);
11     for (int i=1;i<=n;i++)
12       scanf("%d%d%d",&a[i],&b[i],&c[i]);
13     tot=0;
14     int now=1,x=0,t=0;
15     while (now<=n)//二进制优化
16     {
17         x=1;
18         t=c[now];
19         while (t-x>0)
20         {
21             ++tot;
22             w[tot]=x*a[now];
23             v[tot]=x*b[now];
24             t-=x;
25             x=x*2;
26         }
27         if (t>0)
28         {
29             ++tot;
30             v[tot]=t*b[now];
31             w[tot]=t*a[now];
32         }
33         s[now]=tot;
34         ++now;
35     }
36     cin>>q;
37     int me=0;
38     for (int i=1;i<=q;++i)//寻找询问中最大的容量
39     {
40         scanf("%d%d",&d[i],&e[i]);
41         d[i]+=1;
42         if (e[i]>me)
43           me=e[i];
44     }
45     for (int i=1;i<=tot;++i)//正着
46       for (int j=0;j<=me;++j)
47         if (j<w[i])
48           f[i][j]=f[i-1][j];
49         else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
50     for (int i=tot;i>=1;i--)//倒着
51       for (int j=0;j<=me;++j)
52         if (j<w[i])
53           f2[i][j]=f2[i+1][j];
54         else f2[i][j]=max(f2[i+1][j],f2[i+1][j-w[i]]+v[i]);
55     int ans=0;
56     for (int i=1;i<=q;++i)
57     {
58       ans=0;
59       for (int j=0;j<=e[i];++j)//枚举两边的容量如何分配
60         if (f[s[d[i]-1]][j]+f2[s[d[i]]+1][e[i]-j]>ans)
61           ans=f[s[d[i]-1]][j]+f2[s[d[i]]+1][e[i]-j];
62       printf("%d\n",ans);
63     }
64     return 0;
65 }

转载于:https://www.cnblogs.com/Maxxzy/p/6228636.html

DSY3163*Eden的新背包问题相关推荐

  1. BZOJ3163 [Heoi2013]Eden的新背包问题

    如果是裸的多重背包就非常简单了... 用f[i]表示用了cost为i的时候的最大价值 所以我们二分某一段[l, r]之间的物品不使用,剩下的都使用的最大值,这时的f[]数组可以由之前的f[]数组得到. ...

  2. 【题解】lugu P4095 Eden的新背包问题

    总结: 1. 50分的代码(因为由多个数据,所以不能改变num[]数组) #include<bits/stdc++.h> using namespace std; struct node{ ...

  3. 2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)

    2287. [POJ Challenge]消失之物 这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路. 显然不能枚举每个物品消失O(n)O( ...

  4. [背包DP] 洛谷相关题目整理与练习(74题-)

    题目 以背包为标签,搜出了这么多题,按难度排序,一道一道做: (*):下面有提到 TODO 题目 难度 备忘录 AC 采药 普及- 01背包模板 AC 开心的金明 普及- 01背包模板 AC 小A点菜 ...

  5. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  6. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  7. 【整理向】OJ上一些不(jiao)错(shui)的背包题

    CodeVS 1491 取物品 1047 邮票面值设计 3372 选学霸 1155 金明的预算方案 1014 装箱问题 BZOJ 3407: [Usaco2009 Oct]Bessie's Weigh ...

  8. Team Task:DP

    我分到的任务是看ppt--so这篇blog大概就是我的任务进度了?好像还混杂了一些奇怪的求助-- 提纲篇 又名如何高效看PPT? 动态规划优化.pdf  By ExfJoe 2018/4/11 14: ...

  9. 成为Java GC专家(5)—Java性能调优原则

    2019独角兽企业重金招聘Python工程师标准>>> 这是"成为Java GC专家"系列的第五篇文章.在第一篇深入浅出Java垃圾回收机制中,我们已经学习了不同 ...

最新文章

  1. Install NSCA
  2. Go 语言的垃圾回收演化历程:垃圾回收和运行时问题
  3. 浏览器是如何解析html的?
  4. 嵌入式系统——RS232和RS449
  5. python写彩票程序30选7_写一个彩票程序:30选7
  6. 4个月掌握核心技术 成为云计算行业专家
  7. MATLAB 2017b 安装教程,这一篇文章就够了。强烈推荐!!!!!
  8. 直击固定资产管理痛点,让企业轻松管理海量固定资产
  9. Java 参数类型后面三个点,可变参数列表
  10. mysql汽车租赁管理系统
  11. 安卓基于图像识别和CNN做出一个通用的斗地主记牌器(一)
  12. 如何用计算机串口烧录芯片,如何使用串口烧写xmc1301芯片.pdf
  13. 简单介绍一下ODI的几个基本概念
  14. 定时任务---Only no-arg methods may be annotated with @Scheduled
  15. python: 百度地图api爬虫
  16. 基于Java Web的在线考试系统的实现
  17. OSPF路由协议及工作原理(一)
  18. 1,0在js中有可能会等于true和false来去判断的
  19. Java 实现重试机制
  20. Navicat下载,安装,PJ和简单使用的详细图文教程

热门文章

  1. (三)集成学习上——偏差与方差
  2. Android 保存QQ密码(数据存储:文件存储、SharedPreferences)
  3. 给自己电脑增加数T的空间(不用添加硬盘)
  4. 网页设计有什么标准?细说网页设计的6大规范
  5. 短视频配音用什么软件好?短视频配音软件免费哪款好用?
  6. wamp+cmd命令行配置zend框架
  7. 正弦曲线投影及ENVI下Modis数据坐标投影定义
  8. android 系统图标资源,Android系统资源图标android.R.drawable
  9. Windows10+Ubuntu18 双系统安装的血与泪【附许多资源链接】
  10. CPU主频,倍频,外频,系统总线频率,前端总线频率 ——网络上查到的比较清楚的解释