原题:https://ac.nowcoder.com/acm/contest/889/D

题意:

给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个)

思路:

直接搜索要\(2^{36}\)次,时间过多,考虑一次搜索前半集合,一次搜索后半集合,得到两个\(2^{16}\)的答案数组,就变成了双数组匹配问题

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
struct node{
ll vis,v;//用二进制数vis表示元素的选择情况
node(ll a=0,ll b=0):vis(a),v(b){}
bool operator<(node b){
return v<b.v;
}
}N[maxn];
ll a[40];
ll n,half,cnt;
ll s;
void dfs(ll cur,ll sum,ll vis){
if(sum>s)return;
if(cur==half){
N[++cnt].vis=vis;
N[cnt].v=sum;
return;
}
if(a[cur]+sum<=s) dfs(cur+1,sum+a[cur],vis|1<<(cur-1));
dfs(cur+1,sum,vis);
}
void dfs_(ll cur,ll sum,ll vis){
if(sum>s) return;
if(cur==n+1){
ll temp=s-sum;
ll p=lower_bound(N+1,N+1+cnt,node(1,temp) )-N;
if(N[p].v==temp){
ll t=N[p].vis;
for(int i=1;i<half;i++){
if(t&1) printf("1");
else printf("0");
t=t>>1;
}
t=vis;
for(int i=half;i<=n;i++){
if(t&1) printf("1");
else printf("0");
t=t>>1;
}
printf("\n");
exit(0);
}
return;
}
if(sum+a[cur]<=s) dfs_(cur+1,sum+a[cur],vis|1<<(cur-half));
dfs_(cur+1,sum,vis);
}
int main(){
cin>>n>>s;
half=n/2;
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
dfs(1,0,0);
sort(N+1,N+1+cnt);
dfs_(half,0,0);
}

2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)的更多相关文章

  1. 牛客多校第九场 D Knapsack Cryptosystem 背包

    题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...

  2. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  3. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  4. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  5. [2019牛客多校第二场][G. Polygons]

    题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...

  6. 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...

  7. 2019牛客多校第二场D-Kth Minimum Clique

    Kth Minimum Clique 题目传送门 解题思路 我们可以从没有点开始,把点一个一个放进去,先把放入一个点的情况都存进按照权值排序的优先队列,每次在新出队的集合里增加一个新的点,为了避免重复 ...

  8. 2019牛客多校第二场H-Second Large Rectangle

    Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...

  9. 2019牛客多校第二场F-Partition problem(搜索+剪枝)

    Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...

随机推荐

  1. Java学习之线程间通信(双线程)

    线程间通讯:多个线程在处理同一资源,但是任务不同 练习一:双线程出现线程安全问题,需要使用同步,思考同步代码添加位置需求:银行账户存钱,显示谁在账户存钱了,存了多少钱分析:操作同一银行账户两个不同的操 ...

  2. 神他么奇怪NoClassDefFoundError

    javaweb 项目,部署在Tomcat服务器 十分奇葩的问题 之前一直好好的,今天突然就给报错.代码没动过.真是奇葩.创建User对象报NoClassDefFoundError, User类是一个普 ...

  3. Bootstrap 学习笔记3 输入框和导航组件

    导航组件: 导航条组件: 导航条代码: <nav class="navbar navbar-default"> <div class="containe ...

  4. JQuery实现页面跳转

    $(function(){ var pn = $("#gotopagenum").val();       //#gotopagenum是文本框的id属性 location.hre ...

  5. loadrunner 快捷键

    lr 不同的界面切换 crt f6lr:选中要查找的内容 ctrl +f3 超找文本 选中所有字母大写 ctl +shift+ u;小写

  6. 多线程--ThreadLocal类

    一.ThreadLocal类简介--此类是在整个开发过程中至关重要的类,他主要是在开发过程中解决了核心资源和多线程并发访问的处理情况--在真正去了解ThreadLocal类作用的时候,我们可以先编写一 ...

  7. [fw]IDT表的初始化

    IDT表的初始化  linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((_ ...

  8. boby标签中相关标签

    有关字体相关的标签 h1~h6   字体大小 标题使用<h1>至<h6>标签进行定义,<h1>定义最大的标题,<h6>定义最小的标题.具有 align属 ...

  9. 彩彩只能变身队团队项目进展记录by后端

    2018.06.03 早上8:00-晚上8:00 后端小组一起在图书馆四楼边学边做: 1.首先搞定了数据库,学会了怎样用命令行来操作数据库,并且建立了一个用户表. 2.然后自己设计了一个简陋的前端页面 ...

  10. 【教程】linux安装nginx(详细)

    博主最近在安装Nginx,虽然之前安装过,但是没有记录安装过程,导致现在安装过程中遇到坑,现记录一下,希望能帮助到你. 1:安装编译工具及库文件 yum -y install make zlib zl ...