一句话题意:给你一个包含n个元素的集合,问有多少个非空子集,能划分成和相等的两份。(n<=20)

题解:对于这道题,我们很轻易可以列出\(O(3^n)\)的暴力,这是显然过不了的,观察这道题的性质可以发现我们显然可以查找左半边把值扔到hash表里,然后查找右半边的时候更新答案,这是显然正确的,因为我们对于hash表维护的的是两个集合的差值,所以不用担心每半边内部的情况会判不到。

#include<cstdio>
#include<algorithm>
using namespace std;
int now,n,h[1000011],nxt[1000011],a[1000011],B[1000011],A[1000011],nm[22],ans;
bool vis[10000011];
const int mod=1000007;
void ins(int x,int y)
{
int k=abs(x)%mod;
for(int i=h[k];i;i=nxt[i])
if(A[i]==x&&B[i]==y)return ;
++now;nxt[now]=h[k];h[k]=now;A[now]=x;B[now]=y;
}
void get(int x,int y)
{
int k=abs(x)%mod;
for(int i=h[k];i;i=nxt[i])
if(A[i]==x)vis[y+B[i]]=1;
}
void dfs2(int x,int y,int z)
{
if(x==n+1)
{
get(y,z);
return ;
}
dfs2(x+1,y+a[x-1],z+nm[x-1]);
dfs2(x+1,y-a[x-1],z+nm[x-1]);
dfs2(x+1,y,z);
}
void dfs1(int x,int y,int z)
{
if(x==n/2+1)
{
ins(y,z);
return ;
}
dfs1(x+1,y+a[x-1],z+nm[x-1]);
dfs1(x+1,y-a[x-1],z+nm[x-1]);
dfs1(x+1,y,z);
}
int main()
{
scanf("%d",&n);
nm[0]=1;
for(int i=1;i<=21;i++)nm[i]=nm[i-1]<<1;
for(int i=1;i<=n;i++)scanf("%d",&a[i-1]);
dfs1(1,0,0);dfs2(n/2+1,0,0);
for(int i=1;i<=(1<<n);i++)if(vis[i])ans++;
printf("%d",ans);
}

subsets(2018.10.16)的更多相关文章

  1. 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)

    传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...

  2. swap(2018.10.16)

    题意:给定一个{0,1,2,3,-,n-1}的排列 p. 一个{0,1,2 ,-,n-2}的排列 q 被认为是优美的排列, 当且仅当 q 满足下列条件 对排列 s={0,1,2,3,...,n-1}进 ...

  3. 在 .NET项目中使用 Redis(2018.10.16)

    1. 打开NuGet管理器搜索redis,安装:“StackExchange.Redis” 2. 配置 Web.config 文件 <connectionStrings> <add ...

  4. 2018.10.16 spoj Can you answer these queries V(线段树)

    传送门 线段树经典题. 就是让你求左端点在[l1,r1][l1,r1][l1,r1]之间,右端点在[l2,r2][l2,r2][l2,r2]之间且满足l1≤l2,r1≤r2l1\le l2,r1 \l ...

  5. 2018.10.16 NOIP模拟 长者(主席树+hash)

    传送门 考试的时候开始sb的以为需要可持久化trietrietrie树,发现建树时空都是O(n2)O(n^2)O(n2)的. 然后发现由于每次只从原来的字符串改一个字符. 因此直接主席树维护区间has ...

  6. 2018.10.16 NOIP模拟 华莱士(并查集)

    传送门 按照题意模拟维护最小的环套树森林就行了. 然而考试的时候naivenaivenaive瞎写了一个错误的贪心. 代码

  7. 2018.10.16 NOIP模拟 膜法(组合数学)

    传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...

  8. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  9. 2018.10.16 Java的IO与NIO

    IO流学习总结 一 Java IO,硬骨头也能变软 二 java IO体系的学习总结 三 Java IO面试题 NIO与AIO学习总结 一 Java NIO 概览 二 Java NIO 之 Buffe ...

随机推荐

  1. 超实用的 Nginx 极简教程,覆盖了常用场景(转)

    概述 安装与使用 安装 使用 nginx 配置实战 http 反向代理配置 负载均衡配置 网站有多个 webapp 的配置 https 反向代理配置 静态站点配置 搭建文件服务器 跨域解决方案 参考 ...

  2. 如何设置SVN提交时必须输入注释

    在Windows环境 在SVN的Repositories路径,E:\Repositories\demo20170408\hooks: 创建pre-commit.bat批处理文件. 文件内容: @ech ...

  3. java之EJB

    EjB,只是一个服务端运行组件,公开接口供客户端以C/S方式调用而已. 最直白,最本质的解释,可参见: http://blog.csdn.net/jojo52013145/article/detail ...

  4. 操作系统:Bochs 2.6.8的配置文件bochsrc.bxrc修改

    由于现在Bochs 2.6.8相比之前有些改动,之前的配置文件不能直接运行,针对配置文件需要有些修改. 1. 配置文件 ######################################## ...

  5. LightOJ1341 Aladdin and the Flying Carpet —— 唯一分解定理

    题目链接:https://vjudge.net/problem/LightOJ-1341 1341 - Aladdin and the Flying Carpet    PDF (English) S ...

  6. 手写Future模式

    根据前面我所说的Futrue模式,手写一个: 分别对应的Java代码,大家拿来参考: package FutureTest; //公共data数据接口 public abstract class Da ...

  7. ffmpeg遇到inttypes.h和UINT64_C

    http://blog.csdn.net/cll131421/article/details/7763657 编译过程:错误一:无法打开包括文件:“inttypes.h”: No such file ...

  8. ubuntu下的google拼音输入法(终结版)

    声明:此文章是从我的51cto博客上搬至于此. Ubuntu下SCIM应该是最好的中文输入法了,它与搜狗差不多,下面介绍它的安装方法: 1)终端输入: sudo apt-get remove scim ...

  9. java中的异常The given object has a null identifier

    修改页面点击提交时报如下异常: org.hibernate.TransientObjectException: The given object has a null identifier: com. ...

  10. webpack 错误心得

    使用webpack 打包项目已经有很长一段时间了,在使用过程中也碰到各种恶样的坑,常见的错误,当然也有少见的错误,今天写这篇文章主要是想分享找出错误和解决错误的方法. 而不是分享具体的错误例子,因为实 ...