一句话题意:给你一个包含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. 在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as c rashed and should be repaired when using LOCK TABLES

    在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as cra ...

  2. [Java多线程] volatile 关键字正确使用方法

    volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性,即多线程环境中,使用 volatile 关键字的变量仅可以保证不同线程读取变量时,可以读到最新修改的变量值,但是 ...

  3. wireshark 学习 1

    wireshark 调试WiFi 安装之后的启动脚步. #!/bin/bash iw dev mon0 del iw dev wlp3s0 interface add mon0 type monito ...

  4. 代码空间项目 -- cookie的基本使用

    cookie在日常开发b/s架构时候经常使用,可以在记住用户,方便自动登录,也可以记住用户的偏好并对应推送广告 下面说说开发时候的基本用法: 1.创建cookie//设置cookie,键值对形式Coo ...

  5. 在ubuntu16.04上编译android源码【转】

    本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  6. hadoop 常用命令总结

    1. 查看集群资源信息 hdfs dfsadmin -report 2. 启动一个mapreduce任务, hadoop jar /opt/hadoop/share/hadoop/tools/lib/ ...

  7. python实现路由追踪,并生成追踪图片

    #!/usr/bin/env python # -*- coding: utf-8 -*- import os,sys,time,subprocess import warnings,logging ...

  8. haproxy官方配置文档地址

    http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20http-keep-alive

  9. IPFS - 可快速索引的版本化的点对点文件系统(草稿3)

    摘要 星际文件系统是一种点对点的分布式文件系统, 旨在连接所有有相同的文件系统的计算机设备.在某些方面, IPFS类似于web, 但web 是中心化的,而IPFS是一个单一的Bittorrent 群集 ...

  10. 如何查看智能手机的IP地址

      1.  外网IP IP地址可简单分为两类.外网IP或称公网IP是用来在Internet上唯一标识你的设备的.如果你通过GPRS或者3G技术接入互联网的话(通过运营商网络),那么你也可以通过下面的方 ...