题目

题意:

给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0

例如:3  4

   2 3 4

输出:0 0 1

题解:

认真想一下这一道题,首先看到n不是多大就想用dfs(超时),又在dfs的基础上记忆化(超时),大概是我记忆化不完全。又想用01背包,打出来代码后发现s就是体积,但是s的范围太大了,数组存不下 T_T

看题解发现用一个叫 折半枚举(就是一种思想) 和 二进制枚举 的东西

折半枚举:比如有时集合过大无法全部搜索,但刚好只需要他们的和或其他可以处理出的东西,就可以一半一半搜

知道了这两个东西,你就可以先对输入的n个数据中的前一半枚举,并记录他们每一个状态的值;之后再对后一半枚举,如果在枚举过程中时刻和前一半枚举的数据对照一下,找到了满足题意得方式就跳出循环

代码:

 1 #include <stdio.h>
2 #include <algorithm>
3 #include <iostream>
4 #include <string.h>
5 #include<math.h>
6 #include<set>
7 #include<map>
8 using namespace std;
9 const int maxn = 105;
10 const int INF=0x3f3f3f3f;
11 const int mod=1000000007;
12 typedef long long ll;
13 ll n,s,a[maxn],p[maxn];
14 int main()
15 {
16 map<ll,string>m1;
17 map<ll,string>m2;
18 scanf("%lld%lld",&n,&s);
19 for(ll i=0;i<n;++i)
20 scanf("%lld",&a[i]);
21 for(ll i=0;i<1<<(n/2);i++)
22 {
23 string vis;
24 ll sum=0;
25 for(ll j=0;j<n/2;j++)
26 {
27 if((i>>j)&1)
28 {
29 sum=sum+a[j];
30 vis.push_back('1');
31 }
32 else vis.push_back('0');
33 }
34 m1[sum]=vis;
35 }
36 for(ll i=0;i<1<<(n-n/2);i++)
37 {
38 string vis;
39 ll sum=0;
40 for(ll j=0;j<n-n/2;j++)
41 {
42 if((i>>j)&1)
43 {
44 vis.push_back('1');
45 sum+=a[n/2+j];
46 }
47 else vis.push_back('0');
48 }
49 m2[sum]=vis;
50 if(m1.count(s-sum))
51 {
52 cout<<m1[s-sum]<<m2[sum]<<endl;
53 break;
54 }
55 }
56 return 0;
57 }

顺便在补充一下位运算:

>> :右移 最高位是0,左边补齐0;最高为是1,左边补齐1

<<  :左移 左边最高位丢弃,右边补齐0       (数据没有溢出情况下,右移==除2;左移==乘2)

>>>:无符号右移 无论最高位是0还是1,左边补齐0

2 >> 2  == 4

4 >> 2  ==16

4 << 2  ==1

2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  3. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  4. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

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

  5. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  6. 2019牛客暑期多校训练营(第一场) B Integration (数学)

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

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

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

  8. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  9. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

随机推荐

  1. LeetCode94 二叉树的中序遍历

    给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?       /** * ...

  2. 【Flutter】功能型组件之导航返回拦截

    前言 为了避免用户误触返回按钮而导致APP退出,在很多APP中都拦截了用户点击返回键的按钮,然后进行一些防误触判断,比如当用户在某一个时间段内点击两次时,才会认为用户是要退出(而非误触).Flutte ...

  3. python_字典(dict)

    dict 一.结构: info = { "key":"value", "key":"value" } print(inf ...

  4. Redis Cluster 集群节点维护 (三)

    Redis Cluster 集群节点维护: 集群运行很久之后,难免由于硬件故障,网络规划,业务增长,等原因对已有集群进行相应的调整,比如增加redis nodes 节点,减少节点,节点迁移,更换服务器 ...

  5. requests基础封装-get/post封装

     字符串转化成字典: convert_to_dict.py: import jsonstr1 = '{"grant_type":"client_credential&qu ...

  6. maven生命周期与插件

    目录 Maven生命周期 clean default site 命令与对应周期 插件与绑定 插件目标 插件绑定 内置绑定 自定义绑定 插件配置 本文主要是针对<maven实战>书中关键知识 ...

  7. Java Mybatis快速入门之基本使用

    目录 搭建环境 编写 Mybatis 核心配置文件 pom导出资源失败 测试 搭建环境 新建Maven项目 导入Maven依赖 <dependencies> <!--mysql驱动- ...

  8. 【Spring】Spring中的Bean - 1、Baen配置

    Bean配置 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 什么是Spring中的Bean? Spring可以被看作是一个 ...

  9. Electron小白入门自学笔记(一)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14297176.html 一.从Hello Electron开始 创建一个空的文件夹, ...

  10. AWS IoT Greengrass是什么?V1和V2版本及其差异

    AWS IoT Greengrass ​ Greengrass主要是用于边缘计算或者机器学习有关,对于详细了解请阅读结尾处的官方文档,文档内容也较为丰富. 目录 AWS IoT Greengrass ...