【问题描述】

给定n个物品,每个物品可以不选或选一个,第i个物品的价格为ci,价值为vi,出现时间为ti。有m个询问,每次询问在出现时间不超过Ti的所有物品中选若干件,总花费不超过Mi的情况下,被选择物品的价值和的最大值是多少。

【输入格式】

第一行输入n,m。

接下来n行每行3个整数表示ci,vi,ti.

接下来m行询问每行2个整数表示ti,mi.

【输出格式】

输出m行,每行一个整数表示第i个询问的答案。

【样例输入】

5 2

3 6 1

5 7 4

8 2 9

10 1 7

3 3 4

9 50

4 30

【样例输出】

19

16

【数据规模】

  %30: n≤10,m≤20;  ci,vi,ti≤20,Mi≤1000

  %60: n≤100,m≤1000;  ci,Mi≤100000,vi≤100,ti<=300

%100: n≤300,m≤100000; ci,Mi≤10^9,vi≤300,ti<=300

【分析】另类背包+单调优化

先将物品时间升序排列,首先想到01背包,但c和M太大无法承受。
考虑到vi很小:记f[i,j]为1..i件物品选出j的价值和的最小花费,O(N^3),空间刚好足够。
对于一个询问的答案就是:
1、算出在Ti时间内所能购买的物品范围[1,x]
2、答案就是满足f[x,j]≤Mi的最大j
暴力处理询问的话依然会TLE
于是二分:
记g[x,j]为f[x,j…]的最小值,这样g[x]就是单调增的
答案就是满足g[x,j]≤Mi的最大j

本人总结:

一般的背包我们求最大值所以我们的初值可以放心的设置为0
因为即使不能恰好凑到那个数目
我们可以以非0的容量为起点恰好凑到这个数目
但是如果我们改变状态求达到某个价值的容量最小值
我们明显不能凑到的地方始终都会是最大值
显然我们要求到一个价值的容量最小值
其实也就包含了更大的价值的最小值
有可能这个价值不能被恰好凑到,这就是取min的特点
但相对于能凑到更大的价值用更小的空间,我们可以理解成抛弃掉这么多空间来更新
所以我们这种情况下一定用原来的方法更新完之后要从后往前取保证单调性
因为我们不能从比自己小的价值的最小容量转移过来,所以只能从后面转移过来了
在这道题目里面我们求某价值的最小容量
我们在查询的之后最小容量相同的情况下我们会找到最大的价值,所以不会漏解
也就是找到刚好凑到的价值
从后往前取min保证二分可以顺利进行,这就是意义所在

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 1000006
 6 using namespace std;
 7 struct node {
 8     long long c,v,t;
 9 } s[N];
10 bool cmp(const node&a,const node&b) {
11     return a.t<b.t;
12 }
13
14 long long Time[N],f[301][90002],maxVal;
15 long long n,m;
16 long long Find(long long Judge) {
17     long long l=1,r=n,mid;
18     while(l<=r) {
19         mid=(l+r)>>1;
20         if(Time[mid]<=Judge)l=mid+1;
21         else r=mid-1;
22     }
23     return r;
24 }
25 long long Find(long long x,long long Judge) {
26     long long l=0,r=maxVal,mid;
27     while(l<=r) {
28         mid=(l+r)>>1;
29         if(f[x][mid]<=Judge)l=mid+1;
30         else r=mid-1;
31     }
32     return r;
33 }
34 long long read(){
35     long long x=0,f=1;
36     char c=getchar();
37     while(!isdigit(c)){
38         if(c=='-')f=-1;
39         c=getchar();
40     }
41     while(isdigit(c)){
42         x=(x<<3)+(x<<1)+c-'0';
43         c=getchar();
44     }
45     return x*f;
46 }
47 int main() {
48     cin>>n>>m;
49     for(long long i=1; i<=n; i++) {
50         s[i].c=read(),s[i].v=read(),s[i].t=read();
51         maxVal+=s[i].v;
52     }
53     sort(s+1,s+n+1,cmp);
54     for(long long i=1; i<=n; i++)Time[i]=s[i].t;
55     memset(f,0x3f3f3f3f,sizeof f);
56     f[0][0]=0;
57     for(long long i=1; i<=n; i++) {
58         for(long long j=maxVal; j>=0; j--) {
59             if(j>=s[i].v)f[i][j]=min(f[i-1][j],f[i-1][j-s[i].v]+s[i].c);
60             else f[i][j]=f[i-1][j];
61         }
62     }
63     for(long long i=1; i<=n; i++) {
64         for(long long j=maxVal-1; j>=0; j--) {
65             f[i][j]=min(f[i][j],f[i][j+1]);
66         }
67     }
68     for(long long i=1; i<=m; i++) {
69         long long T,M;
70         T=read(),M=read();
71         cout<<Find(Find(T),M)<<'\n';
72     }
73     return 0;
74 }
75
76 //bag

over

转载于:https://www.cnblogs.com/saionjisekai/p/9911879.html

11.05T5 另类背包相关推荐

  1. JZOJ 5440. 【NOIP2017提高A组冲刺11.1】背包

    Description 蛤布斯有n种商品,第i种物品的价格为ai,价值为bi.有m个人来向蛤布斯购买商品,每个人每种物品只能购买一个.第j个人有cj的钱,他会不停选择一个能买得起的价格最高的商品买走( ...

  2. 程序员面试金典 - 面试题 08.11. 硬币(背包DP)

    文章目录 1. 题目 2. 解题 1. 题目 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算 n 分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示 ...

  3. 天刀论剑显示服务器,论剑段位赛关闭 11月25日服务器维护公告

    亲爱的玩家: 青龙乱舞区.大地飞鹰区.血海飘香区.名剑风流区.陌上花开区.边城浪子区全部服务器将在11月25日6:00~8:00停机维护更新,维护完成后上述各服务器客户端版本号升级至1.1.23.4. ...

  4. 视频教程-X64位游戏软件安全逆向入门-其他

    X64位游戏软件安全逆向入门 在职教师,从事it行业多年.兼职培训10余年,主要是反外挂数据分析和游戏数据分析.有明文封包分析系列等多部教程. 曾辉新 ¥600.00 立即订阅 扫码下载「CSDN程序 ...

  5. 技术专题之-技术概述的目录

    提纲挈领 一.技术的概述5 1.1.技术定义5 1.2.为什么将技术当作专题来讲5 二.技术与团队6 2.1.打造一个有创新价值观的团队6 2.2.打造一个有凝聚力的团队6 1) 团队的领导要采取民主 ...

  6. 【LintCode】Backpack 背包问题

    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...

  7. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  8. 分支限界方法装载问题c语言,分支限界法——对解空间的一种策略搜索(广度优先搜索)...

    目录 1.分支限界法简介 1.1 分支限界法的本质--通过限界阻塞子树 1.2 分支限界法与回溯法的区别 1.3 下界或者上界估算--贪心 2.单源最短路径问题 2.1 问题描述 2.2 分支限界法解 ...

  9. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

最新文章

  1. java与javascript之间json格式数据互转
  2. 第十七课:js数据缓存系统的原理
  3. 关于Hibernate中的Configuration
  4. 【数理知识】《积分变换与场论》王振老师-第5章-场论
  5. c++Selection Sort选择排序的实现算法(附完整源码)
  6. PHP的str_split分割字符串成数组
  7. Android Gallery和ImageSwitcher同步自动(滚动)播放图片库
  8. Java字符串替换前缀,从Bash中的字符串中删除固定的前缀/后缀
  9. 避免内存泄漏 - C++快速入门38
  10. 在组件中获取Application
  11. [转载] 当心掉进Python多重继承里的坑
  12. Android 补间动画TranslateAnimation 位移效果
  13. 接口性能测试方案设计方法有哪些?要怎么去写?
  14. 高盛:79页区块链报告-《从理论到实践》(附下载)
  15. 2020-10-31
  16. [转发]行列视(RCV)——生产数据应用系统
  17. C#练习题答案: 反恐精英系列【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  18. 逸创云客服获“金耳唛杯”年度中国最佳客户中心技术产品奖
  19. 正弦值、余弦值和正切值
  20. java long 除_java中long型除法

热门文章

  1. 不确定度在线计算_不确定度标准给找全了,收藏下,有天会用得到
  2. jsp mysql论坛_体育论坛ssm,mysql)
  3. ERROR: This version of Android Studio cannot open this project, please retry with Android Studio 3.
  4. 计算机网络实验【利用wireshark抓包工具抓包】
  5. spring学习--AOP五个通知
  6. go 类型断言_深入理解Go的interface内部执行原理
  7. weblogic进程自动关闭_手机内存不够还卡顿,那是你不会清理,关闭这3个设置就变流畅...
  8. php.ini 没有pdo,检查了启用的php.ini文件“ extension = php_pdo_mysql.dll”,但仍然出错...
  9. html一级子元素,获取子元素_html/css_WEB-ITnose
  10. 如何判断python是否安装成功_python怎么判断模块安装完成