【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) ...
随机推荐
- idea 启动项目提示 Command line is too long. Shorten command line for Application or also for Spring Boot default configuration.
在.idea 文件夹中打开workspace.xml文件找到<component name="PropertiesComponent">,在标签里加一行 <pr ...
- pache tomcat慢速HTTP拒绝服务攻击安全问题解决办法
问题说明:HTTP协议的设计要求服务器在处理之前完全接收到请求.如果HTTP请求未完成,或者传输速率非常低,则服务器将保持其资源占用等待剩余的数据.如果服务器占用的资源太多,则会造成拒绝服务. 漏洞危 ...
- spring事务详解(五)总结提高
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...
- ecmobile-页面空白,也没异常提示,一般就是这个问题
分类页空白了://2018年09月07日14:55:21 四:页面空白 将ON_WILL_APPEAR中有关页面布局方法写在ON_DID_APPEAR方法中.例如:
- Open Source 开发工具集
Open Source 开发工具集 转自:http://www.linuxforum.net原作者:gogoliu(Pooh-Bah) 编辑器: vi:老牌编辑器,在各个unix和unix-like平 ...
- 微软AD相关操作的免费工具
https://www.ittsystems.com/best-free-active-directory-tools/
- gridview使用小知识
1.列改变为select,不能使用gridview.SelectedRow.Cells[0].Text 2.事件执行顺序 RowCommandPageIndexChangingPageIndexCha ...
- 将golang中变量重置为零的reflect方法
下面给出简单的代码,这里通过将变量重置为零来实现过滤字段的目的: type student struct { Age int `json:"age,omitempty"` Name ...
- 操作系统实现线程的几种模式 和 java创建线程的3个方式
操作系统实现线程的几种模式 和 java创建线程的3个方式 这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...
- 20175236 2018-2019-2 《Java程序设计》第六周学习总结
教材学习内容总结 第七章 try :用于监听.将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出. catch:用于捕获异常.catch用来捕获try ...