【CZYZ 20160819】背包
题目描述
蛤布斯有nn个物品和一个大小为mm的背包,每个物品有大小和价值,它希望你帮它求出背包里最多能放下多少价值的物品。
输入数据
第一行两个整数 n,mn,m。
接下来 nn 行每行两个整数 xi,wixi,wi,表示第ii个物品的大小和价值。
输出数据
一行一个整数表示最大价值。
样例输入
5 100
95 80
4 18
3 11
99 100
2 10
样例输出
101
数据范围
对于20%20%的数据,xi≤1500xi≤1500。
对于30%30%的数据,wi≤1500wi≤1500。
对于100%100%的数据,n≤40,0≤m≤1018,0≤xi,wi≤1016n≤40,0≤m≤1018,0≤xi,wi≤1016。
题目分析
整体二分啊,我先打了个DP,结果很悲壮。因为题目的数据太大了,m到long long极限了,所以用整体二分。整体二分是什么呢?我们枚举左半边,并排序。然后对右边进行搜索。这就是折半搜索。然后我们上代码。20分做法就是直接DP滚动数组。
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct aa{int v,w;
friend bool operator<(aa a,aa b){
return a.v!=b.v?a.v<b.v:a.w>b.w;
}}b[<<];
int n,cnt,tot,n2,m,v[],w[],ans;
inline int search(int x){
int l=,r=tot,mid;
while(l<r){
if(b[mid=(l+r)>>].v>x)r=mid;
else l=mid+;
}return b[l-].w;
}void dfs1(int now,int sum_v ,int sum_w){
if(now>n2){b[++cnt]=(aa){sum_v,sum_w};return;}
dfs1(now+,sum_v,sum_w);
if(sum_v+v[now]<=m) dfs1(now+,sum_v+v[now],sum_w+w[now]);
}void dfs2(int now,int sum_v,int sum_w){
if(now>n){
ans=max(ans,sum_w+=search(m-sum_v));
return;
}dfs2(now+,sum_v,sum_w);
if(sum_v+v[now]<=m) dfs2(now+,sum_v+v[now],sum_w+w[now]);
}signed main(){freopen("pack.in","r",stdin),freopen("pack.out","w",stdout);
cin>>n>>m;
for(int i=;i<=n;i++) cin>>v[i]>>w[i];
n2=n>>,dfs1(,,),sort(b+,b+cnt+);
for(int i=;i<=cnt;i++)
if(b[i].v>b[i-].v) b[++tot]=b[i];
for(int i=;i<=tot;i++) b[i].w=max(b[i].w,b[i-].w);
dfs2(n2+,,),cout<<ans;
}
代码说明
我家小姐姐没什么信心,我也没什么期望了。到时候生物信息两开花。说多了都是泪,最近没什么心情更新我们的情感生活了。
【CZYZ 20160819】背包的更多相关文章
- vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)
描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...
- 【USACO 3.1】Stamps (完全背包)
题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
- HDU2159 二维完全背包
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- CF2.D 并查集+背包
D. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...
- UVALive 4870 Roller Coaster --01背包
题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F , D -= K 问在D小于等于一定限度的时 ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- POJ1717 Dominoes[背包DP]
Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6731 Accepted: 2234 Descript ...
- HDU3466 Proud Merchants[背包DP 条件限制]
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
随机推荐
- 去重和分类后缀asp、php等路径 用python3写的
我们在做渗透的时候肯定会用上扫描器的,本人一般会用御剑,当然你也会喜欢别的工具. 很多时候,能否渗透成功其实还挺依赖与字典的,如果把后台给扫出来了,恰好还弱口令,那么岂不是美滋滋. 因此,有一个好的字 ...
- 使用s3fs-fuse 挂载minio s3 对象存储
minio 是一个aws s3 兼容的对象存储系统,我们可以通过s3fs 进行数据桶的挂载,这样可以做好多方便的事情 环境准备 使用docker-compose 运行 minio docker-com ...
- Vue2.5基础
1.1 创建第一个Vue实例 官方网站:https://cn.vuejs.org 学习 --> 安装 刚开始学习Vue,使用最简单的安装方式,直接用<script>引入 我们下载开发 ...
- MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引
什么是索引? 索引用于快速找出某个列中有一特定值的行,不使用索引,mysql必须从第1条记录开始读完整的表,直到找出相关的行.表越大,查询数据所花费的实际越多.如果表中查询的列有一个索引,mysql能 ...
- bzoj5108: [CodePlus2017]可做题
Description qmqmqm希望给sublinekelzrip出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai,你需 要计算其异或前缀和bi,满足条件b1=a1,bi= ...
- Node文件模块
在上一篇文章中有提到,Node模块分为核心模块和文件模块,接下来就简单总结一下文件模块. 文件模块则是在运行时动态加载,需要完整的路径分析.文件定位.编译执行过程.速度相比核心模块稍微慢一些,但是用的 ...
- 二叉树遍历(flist)(二叉树,已知中序层序,求先序)
问题 C: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 76 解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...
- 64 位 Windows 平台开发注意要点之注册表重定向
Window 系统错误代码 ERROR_SUCCESS,本博客中一律使用 NO_ERROR 代替.虽然 ERROR_SUCCESS 与 NO_ERROR 是完全等价的,都代表成功,但是后者却和其他错误 ...
- Redis深入学习笔记(一)Redis启动数据加载流程
这两年使用Redis从单节点到主备,从主备到一主多从,再到现在使用集群,碰到很多坑,所以决定深入学习下Redis工作原理并予以记录. 本系列主要记录了Redis工作原理的一些要点,当然配置搭建和使用这 ...
- HP-Socket v5.0.1:支持 IPv6 及多 SSL 证书
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...