Description

夏令营有N个人,每个人的力气为M(i)。请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法?

Input

第一行一个整数N,表示人数。

接下来N行,每行一个整数M(i)

Output

输出一行一个整数,表示一共多少种选法。

Sample Input

4

1

2

3

4

Sample Output

3

样例解释:

第一种选出{1,2,3},分成{1,2}和{3}两组;

第二种选出{1,3,4},分成{1,3}和{4}两组;

第三种选出{1,2,3,4},分成{1,4}和{2,3}两组。

Data Constraint

40%的数据满足:1<=M(i)<=1000;

对于100%的数据满足:2<=N<=20,1<=M(i)<=100000000

解题思路

折半搜索,先从1搜到n/2,每个有选到A组,选到B组,不选三种选择,最后将总和与状态记下来,n/2+1 ~ n搜一遍同样操作,最后排个序统计答案。

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath> using namespace std;
const int MAXN = 25;
typedef long long LL; struct Data{
LL sum;
LL S;
}data1[1<<20],data2[1<<20]; int a[MAXN],n,k,cnt1,cnt2,ans;
bool vis[(1<<20)+2000]; inline void dfs1(int x,int Sum,int s){
if(x==k+1) {
data1[++cnt1].S=s;
data1[cnt1].sum=Sum;
return ;
}
dfs1(x+1,Sum+a[x],s+(1<<(n-x)));
dfs1(x+1,Sum-a[x],s+(1<<(n-x)));
dfs1(x+1,Sum,s);
} inline void dfs2(int x,int Sum,int s){
if(x==n+1){
data2[++cnt2].S=s;
data2[cnt2].sum=Sum;
return ;
}
dfs2(x+1,Sum+a[x],s+(1<<(n-x)));
dfs2(x+1,Sum-a[x],s+(1<<(n-x)));
dfs2(x+1,Sum,s);
} inline bool cmp(Data A,Data B){
return A.sum<B.sum;
} int main(){
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
k=n/2;dfs1(1,0,0);dfs2(k+1,0,0);
sort(data1+1,data1+1+cnt1,cmp);
sort(data2+1,data2+1+cnt2,cmp);
int i=1,j=1;data1[++cnt1].sum=data2[++cnt2].sum=1e9; while(i<cnt1 && j<cnt2){
if(data1[i].sum<data2[j].sum) i++;
else if(data1[i].sum>data2[j].sum) j++;
else {
int l1=i,r1=i,l2=j,r2=j;
while(data1[r1].sum==data1[l1].sum) r1++;
while(data2[r2].sum==data2[l2].sum) r2++;
for(register int p=l1;p<r1;p++)
for(register int q=l2;q<r2;q++){
if(vis[data1[p].S+data2[q].S]) continue;
ans++;vis[data1[p].S+data2[q].S]=1;
}
i=r1,j=r2;
}
}cout<<ans-1<<endl;
return 0;
}

JZOJ 平衡的子集的更多相关文章

  1. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  2. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

  3. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  4. BST性能分析&改进思路——平衡与等价

    极端退化 前面所提到的二叉搜索树,已经为我们对数据集进行高效的静态和动态操作打开了一扇新的大门.正如我们所看到的,BST从策略上可以看作是将之前的向量(动态数组)和链表结构的优势结合起来,不过多少令我 ...

  5. uva1354 天平难题 【位枚举子集】||【huffman树】

    题目链接:https://vjudge.net/contest/210334#problem/G 转载于:https://blog.csdn.net/todobe/article/details/54 ...

  6. [jzoj NOIP2018模拟11.02]

    嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...

  7. R语言中样本平衡的几种方法

    R语言中样本平衡的几种方法 在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性.在不平衡的数据中,任一算法都没法从样本量少的类中获取 ...

  8. YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集

    YOLO 算法是非常著名的目标检测算法.从其全称 You Only Look Once: Unified, Real-Time Object Detection ,可以看出它的特性: Look Onc ...

  9. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

随机推荐

  1. iOS之String动态书写

    /** String动画书写出来 @param string 要写的字 @param view 父视图 @param ui_font 字体大小 @param color 字体颜色 */ - (void ...

  2. typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)

    1.typedef  int (init_fnc_t) (void);表示定义init_fnc_t为函数类型,该函数返回int型,无参数.而“init_fnc_t  *init_sequence[]= ...

  3. day 42 03--CSS布局设置

      03--CSS布局设置   本节目录 一 盒模型 二 padding(内边距) 三 boder(边框) 四 简单认识一下margin(外边距) 五 标准文档流 六 块级元素和行内元素 七 浮动 八 ...

  4. 04_Spring AOP两种代理方法

    什么是AOP?           AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是O ...

  5. 02_jQuery对象初识(二)筛选器1

    0. HTML对象和jQuery对象的区别: 1.jQuery对象转换成DOM对象,用索引取出具体的标签 2.DOM对象转换成jQuery对象,$(DOM对象) 注意:jQuery对象保存到变量的时候 ...

  6. <随便写>WIN10家庭版调出策略组

    1.管理员运行cmd文件 2.运行窗口输入gpedit.msc 运行结果:

  7. selenium 三种断言以及异常类型

    selenium 提供了三种模式的断言:assert .verify.waitfor Assert 失败时,该测试将终止. Verify 失败时,该测试将继续执行,并将错误记入日显示屏 .也就是说允许 ...

  8. 使用Colaboratory的免费GPU训练神经网络

    1 Colaboratory 介绍 Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并 ...

  9. 搭建一个Semantic-ui项目

    一.进入到项目目录 npm init 二.安装semantic-ui npm install semantic-ui --save 三.编译输出semantic-ui cd  ./semantic g ...

  10. Windows API GetShortPathName GetLongPathName

    函数原型: The GetShortPathName function retrieves the short path form of a specified input path. DWORD G ...