【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) ...
随机推荐
- zeebe 集成elasticsearch exporter
zeebe 目前还在一直的开发中,同时一些变动还是挺大的,比如simple monitor 的以前是不需要配置HazelcastExporter的 估计是为了进行集群功能处理,新添加的,以前写的配置基 ...
- Windows + Flask + Apache + wsgi踏坑总结
据前人踏坑经历,拷贝如下: 1. Apache,mod_wsgi和Python都必须用相同版本的C/C++编译器生成,要么都是32位的,要么都是64位的,不能混用. 2. Apache和mod_wsg ...
- 借助微软提供的url重写类库URLRewriter.dll(1.0)实现程序自动二级域名,域名需要泛解析
二级域名和系统中会员帐号自动关联,也就是系统中注册一个会员,会员自动就可以通过二级域名来访问,比如我的帐号是zhangsan,我在morecoder.com注册后,访问zhangsan.morecod ...
- IO队列深度max_queue_depth对系统性能的影响
前段时间,发生了一个问题引起了我对IO队列深度的研究. 存储服务器中linux kernel的mpt2sas驱动模块,将max_queue_depth设置为1024时,引起系统加载驱动时卡死,而调整为 ...
- vue 深拷贝
Vue.set(row,'isEdit',true); let newRow = JSON.parse(JSON.stringify(row)); this.totalData.push(newRow ...
- 浅析MSIL中间语言——基础篇(转)
来自:https://www.cnblogs.com/dwlsxj/p/MSIL.html 一.开篇 研究MSIL纯属于个人喜好,说在前面MSIL应用于开发的地方很少,但是很大程度上能够帮着我们理解底 ...
- 在虚拟机上配置安装hadoop集群
原本以为有大神已经总结的很清楚了,就不自己在写了, 但是在自己安装的过程中还是出现了一些问题, 所以打算以自己的方式重新总结一下. 参考https://blog.csdn.net/hliq539 ...
- 基于Servlet的Echarts例子(2018-12-26更新)
引子 ECharts是百度出品的,一个使用 JavaScript 实现的开源可视化库.程序员在Web页面上引入并稍作配置就能做出漂亮的数据图表. 本篇文章简单介绍一下如何在JSP中使用Echarts, ...
- 工控随笔_13_西门子_WinCC的VBS脚本_04_变量类型之二
上一个随笔说了一些关于vbs变量类型的内容,这一篇我们继续说说变量类型相关的内容. 一.NULL补充内容 '需要注意的是,NULL不能简单通过 = 来进行比较,而必须通过 'IsNull函数来实现 ' ...
- MongoDB中的读写锁
1. MongoDB 使用的锁 MongoDB 使用的是“readers-writer”锁, 可以支持并发但有很大的局限性当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个写锁的存在,一个单一的 ...