题目描述

蛤布斯有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】背包的更多相关文章

  1. vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)

    描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...

  2. 【USACO 3.1】Stamps (完全背包)

    题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...

  3. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  4. HDU2159 二维完全背包

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. CF2.D 并查集+背包

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...

  6. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  7. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

  8. POJ1717 Dominoes[背包DP]

    Dominoes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6731   Accepted: 2234 Descript ...

  9. HDU3466 Proud Merchants[背包DP 条件限制]

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

随机推荐

  1. node搭建简易的websocket服务

    http协议单向请求,只能客户端向服务器发送消息,然而websocket一旦双方建立连接就可以双方通信,更加深层次的用法是websocket可以做基础,然后不同的客户端可以通过websocket连接可 ...

  2. Python图片裁剪

    我们使用的是Image中的crop(box)功能,它需要一个参数box,元组 类型,元组包括4个元素,如:(距离图片左边界距离x, 距离图片上边界距离y,距离图片左边界距离+裁剪框宽度x+w,距离图片 ...

  3. win2008安装并配置zabbix3.4 agent

    agent 下载地址: https://www.zabbix.com/download_agents 下载解压后有2个文件夹,一个是bin,存放32位和64位执行程序,一个是conf目录存放着配置文件 ...

  4. jdk1.8源码解析(1):HashMap源码解析

    jdk1.8 HashMap数据结构 图1-HashMap类图 图2-TreeNode类图 由图1-HashMap类图可知HashMap底层数据结构是由一个Node<K,V>的数组构成.具 ...

  5. Winfrom BackgroundWorker

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection ...

  6. win10 solidity开发环境搭建

    1. 软件安装 1) 安装nodejs 安装完成后将node.exe所在路径加入环境变量PATH中,以便在cmd命令行中直接使用node和npm命令 下面的操作在git bash下进行 2) 安装so ...

  7. matlab画台风轨迹图小tip

    <写在前面> 关于台风轨迹图,这次由于作业需要就画了一幅轨迹图,参考原图选自论文: LIU Zenghong, XU Jianping, SUN Chaohui, WU Xiaofen. ...

  8. conda,pip 安装指定版本的指定包

    1.conda 安装指定版本的指定包 cuda search tensorflow-gpu 有如下结果: 然后使用conda install package=version 就能安装指定版本的pack ...

  9. python之路——24

    复习 1.面向对象编程 思想:角色的抽象,创建类,实例化,操作实例2.面向对象的关键字 1.类的静态属性,存储在类的命名空间 2.类名.方法(对象),对象.方法 3.对象可以使用静态变量:类不可以使用 ...

  10. 图解 (a + b) * (a + b) == a**2 + 2*a*b + b**2

    示意图