考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况。

然后将后一半的状态按照和排序,$O(2^\frac{n}{2})$枚举前一半的每一个选择情况的状态,将该选择情况下所有状态按和排序,然后通过双指针求出所有合法状态。

时间复杂度$O(6^\frac{n}{2})$。

#include<cstdio>
#include<algorithm>
const int N=20,M=1<<10,E=59100;
int n,n0,i,j,k,a[N],g[M],v[E],nxt[E],ed,m,q[M],ce,ans;bool vis[1<<N];
struct P{int s,S;}e[E];
inline bool cmp(const P&a,const P&b){return a.s<b.s;}
void dfsl(int x,int s,int S){
if(x==n0){v[++ed]=s;nxt[ed]=g[S];g[S]=ed;return;}
dfsl(x+1,s,S);
dfsl(x+1,s+a[x],S|(1<<x));
dfsl(x+1,s-a[x],S|(1<<x));
}
void dfsr(int x,int s,int S){
if(x==n){e[ce].s=s;e[ce++].S=S;return;}
dfsr(x+1,s,S);
dfsr(x+1,s+a[x],S|(1<<x));
dfsr(x+1,s-a[x],S|(1<<x));
}
int main(){
scanf("%d",&n);n0=(n+1)/2;
for(i=0;i<n;i++)scanf("%d",&a[i]);
dfsl(0,0,0),dfsr(n0,0,0);
std::sort(e,e+ce,cmp);
for(i=0;i<1<<n0;i++){
for(m=0,j=g[i];j;j=nxt[j])q[m++]=v[j];
std::sort(q,q+m);
for(j=k=0;j<ce;j++){
while(k<m&&q[k]<e[j].s)k++;
if(k==m)break;
if(q[k]==e[j].s)vis[i|e[j].S]=1;
}
}
for(i=1;i<1<<n;i++)if(vis[i])ans++;
return printf("%d",ans),0;
}

  

BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets的更多相关文章

  1. bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)

    2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 462  Solv ...

  2. BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针

    BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N ...

  3. 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)

    [Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...

  4. 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469

    题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...

  5. bzoj2679:[Usaco2012 Open]Balanced Cow Subsets

    思路:折半搜索,每个数的状态只有三种:不选.选入集合A.选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了. #include<iostream> ...

  6. [Usaco2012 Open]Balanced Cow Subsets

    Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk ...

  7. 【BZOJ】2679: [Usaco2012 Open]Balanced Cow Subsets

    [算法]折半搜索+数学计数 [题意]给定n个数(n<=20),定义一种方案为选择若干个数,这些数可以分成两个和相等的集合(不同划分方式算一种),求方案数(数字不同即方案不同). [题解] 考虑直 ...

  8. BZOJ.2679.Balanced Cow Subsets(meet in the middle)

    BZOJ 洛谷 \(Description\) 给定\(n\)个数\(A_i\).求它有多少个子集,满足能被划分为两个和相等的集合. \(n\leq 20,1\leq A_i\leq10^8\). \ ...

  9. SPOJ-SUBSET Balanced Cow Subsets

    嘟嘟嘟spoj 嘟嘟嘟vjudge 嘟嘟嘟luogu 这个数据范围都能想到是折半搜索. 但具体怎么搜呢? 还得扣着方程模型来想:我们把题中的两个相等的集合分别叫做左边和右边,令序列前一半中放到左边的数 ...

随机推荐

  1. Android四种LaunchMode

    singleTop 的Activity和standard的几乎一样, 把singleTop和standard归为一类启动模式,这种模式不会引起任务栈的变更 singleTop和standard唯一的区 ...

  2. Struts2拦截器之DefaultWorkflowInterceptor

    一.DefaultWorkflowInterceptor是什么 首先说这东西是干嘛来的,在action中可以对传进来的数据进行验证,方法是实现Validateable接口的validate():voi ...

  3. NYOJ题目770仿射密码

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs4AAAIUCAIAAACFKz0yAAAgAElEQVR4nO3dPXLruLaG4TsJ5RqIYw

  4. route netstat -rn

    -n :不要使用通讯协定或主机名称,直接使用ip或port number; -ee:使用更详细的资讯来显示 [root@NB data]# route -nee Kernel IP routing t ...

  5. MongoDB基本命令

    1.  启动和停止MongoDB: 执行mongod命令启动MongoDB服务器.mongod有很多可配置的选项,我们通过mongod --help可以查看所有选项,这里仅介绍一些主要选项:    - ...

  6. ASP.NET Web API 使用Swagger生成在线帮助测试文档

    Swagger-UI简单而一目了然.它能够纯碎的基于html+javascript实现,只要稍微整合一下便能成为方便的API在线测试工具.项目的设计架构中一直提倡使用TDD(测试驱动)原则来开发,sw ...

  7. Win10 AppBar

    <Page.BottomAppBar> <CommandBar x:Name="cmdBar" Background="Transparent" ...

  8. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  9. Mysql添加外键约束

    简单说一下使用外键的好处 1.完整性约束 比如:用户表中有字段 用户编号(id) , 名称(username)设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号 ...

  10. 官方Tomcat 8.0.24 Web漏洞整改记录

    测试环境 web服务器:apache-tomcat-8.0.24-windows-x64 测试工具:Acunetix Web Vulnerability Scanner 9.5 官方Tomcat测试结 ...