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. System.Web.Mvc.ViewEngineResult.cs

    ylbtech-System.Web.Mvc.ViewEngineResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, P ...

  2. [原创]Java调用PageOffice在线打开数据库中保存的Word文件

    PageOffice产品和数据库是两个独立的概念,严格来说两者之间没有任何本质关系.PageOffice不依赖数据库而存在,但是数据库和PageOffice可以结合使用来完成某些复杂的业务逻辑.例如: ...

  3. 深度神经网络Google Inception Net-V3结构图

    深度神经网络Google Inception Net-V3结构图 前言 Google Inception Net在2014年的 ImageNet Large Scale Visual Recognit ...

  4. deepfake安装python常用命令

    pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ python -m p ...

  5. Leetcode 345 Reverse Vowels in a String

    两个for 第一个for将每一个元音依次存放进一个char数组 第二个for,每检测到元音,就从char数尾部开始,依次赋值 如何检测元音呢?当然写一个冗长的if(),不过我们有更好的选择 hashs ...

  6. leetcode 324 Wiggle Sort 2

    利用中位数的概念,中位数就是将一组数分成2等份(若为奇数,则中位数既不属于左也不属于右,所以是2等份),其一组数中任何一个元素都大于等于另一组数 那么我们是不是只要一左一右配合着插入,就保证了差值+- ...

  7. DSMM之数据处理安全

    一.背景 数据安全生命周期分为采集.传输.存储.处理.交换.销毁几个阶段,其中数据处理阶段是整个周期的核心阶段,数据处理安全与否直接关系到整体数据安全.那么今天分享内容就是数据处理安全的相关要求和实现 ...

  8. Activiti实战04_简单流程

    在Activiti实战03_Hello World中我们介绍了一个中间没有任何任务的流程,实现了流程的部署与查阅,而在本章中,将会为流程添加任务节点,是流程能够像个流程,变得更加丰满起来. 在上一节的 ...

  9. 016-WebDriver API(2)

    1. 多表单切换 WebDriver只能在一个页面上对元素进行识别和定位,无法直接定位frame/iframe表单内嵌页面上的元素,这是就需要通过switch_to.frame()方法将当前定位的主体 ...

  10. grep与find命令的区别

    grep与find命令的区别:grep搜索的是文本,find搜索的是文件,换句话说就是grep是查找匹配条件的行,find是搜索匹配条件的文件. grep文本搜索/过滤 用法:grep[参数]搜索字符 ...