[题目描述]

给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数。

[输入文件]

第一行 n 个正整数

以下有 n行,每行1个

正整数表示整数序列a

[输出文件]

一个整数表示答案

[输入样例]

4

1 2 3 4

[输出样例]

3

[数据范围]

30%:n<=5

100%:n<=20

100%:a 中每个元素<=100000000

题解:

对于前半部分和后半部分dfs枚举

将前半部分得到的值包括状态存进hash(去重),在把后半部分的所有状态去重在hash中查找

本来是用的三进制数表示存进子集A,存进子集B,删去3种状态,后面发现没有必要

因为是“删数的方案”,也就是除删去的数,AB集合间如何分配并不关心,所以直接二进制就行

注意hash不能只存值,还要保存二进制数以判重,保存二进制数的数组不能太小也不能大

hash的大小70000够了,状态数组zt[70000][700]正好AC,500则90分,100则75分

博客里上传了数据,在管理里的文件

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
long long s;
int p;
}f[];
int n,zt[][],len,h[];
long long ans,has[],sp[],inf,a[];
bool cmp(Node a,Node b)
{
return (a.s<b.s||(a.s==b.s&&a.p<b.p));
}
void push_hash(long long x,int i)
{int j;
long long p=(x+)%;
while (has[p]!=inf&&has[p]!=x)
{
p++;
if (p>) p=;
}
if (has[p]==inf)
{
has[p]=x;
sp[p]=;
zt[p][sp[p]]=i;
}
else if (has[p]==x)
{
for (j=;j<=sp[p];j++)
if (i==zt[p][j]) return;
sp[p]++;
zt[p][sp[p]]=i;
}
}
void ask_hash(long long x,int i)
{int j;
long long p=(x+)%;
while (has[p]!=inf&&has[p]!=x)
{
p++;
if (p>) p=;
}
if (has[p]==x)
{
for (j=;j<=sp[p];j++)
h[zt[p][j]|i]=;
}
}
void dfs1(int x,long long s,int p)
{int i;
if (x>n/) push_hash(s,p);
else
for (i=-;i<=;i++)
dfs1(x+,s+i*a[x],p|((i!=)<<(x-)));
}
void dfs2(int x,long long s,int p)
{int i;
if (x>n) f[++len]=(Node){s,p};
else
for (i=-;i<=;i++)
dfs2(x+,s+i*a[x],p|((i!=)<<(x-)));
}
int main()
{int i,j;
long long s;
freopen("regex.in","r",stdin);
freopen("regex.out","w",stdout);
cin>>n;
memset(has,-,sizeof(has));
inf=has[];
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
dfs1(,,);dfs2(n/+,,);
sort(f+,f+len+,cmp);
for (i=;i<len;i++)
if (f[i].s==f[i+].s&&f[i].p==f[i+].p) f[i].s=(<<);
sort(f+,f+len+,cmp);
while (f[len].s==(<<)) len--;
for (i=;i<=len;i++)
ask_hash(-f[i].s,f[i].p);
for (i=;i<=(<<n)-;i++) ans+=h[i];
//cout<<h[i]<<endl;
cout<<ans;
}

删数方案数(regex)的更多相关文章

  1. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  2. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. NOIP2012pj摆花[DP 多重背包方案数]

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  4. UVa 11137 (完全背包方案数) Ingenuous Cubrency

    题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...

  5. poj2975 Nim 胜利的方案数

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5545   Accepted: 2597 Description N ...

  6. ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」

    传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...

  7. P2347 砝码称重-DP方案数-bitset

    P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...

  8. [HAOI2017]方案数[组合计数、容斥、dp]

    题意 题目链接 分析 先考虑没有障碍怎么做,定义 f(i,j,k) 每一维走了 i,j,k 位的方案数,转移乘个组合数即可. 现在多了一些障碍,考虑容斥.实际我们走过的点都有严格的大小关系,所以先把所 ...

  9. hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)

    n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ...

随机推荐

  1. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

  2. 201621123057 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...

  3. 20145237《Java程序设计》实验报告一

    实验一 Java开发环境的熟悉(Windows + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1 ...

  4. 最短路算法模板SPFA、disjkstra、Floyd

    朴素SPFA(链表建边) #include <iostream> #include <cstdio> #include <cstring> #include < ...

  5. NFC驱动调试

    1.NFC基本概念: NFC 又称为近场通信,是一种新兴技术,可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID) 及互连互通技术整合演变而来,通过单一芯片集成感应式读卡器: NFC有 ...

  6. java图片处理开源框架

    java图片处理开源框架 以前一直不明白,java开源框架什么意思,搜集资料得出以下结论 其实java框架可以理解为一个工具或者一个插件,将一个公用的.常用的技术封装起来,处理一些基础的.繁琐的问题. ...

  7. STM32常见问题

    一.STM32 下不了程序 提示: (1).JLink Info: CPU halted Erase Done. Programming Failed! 解决办法: 用isp把芯片全部擦除再试试,如果 ...

  8. zTree根据json选中节点,并且设置其他节点不可选

    首先,在适配目录树时,使用checkbox形式,配置代码如下: var settingCatalog = { check:{ enable: true }, data:{ simpleData:{ e ...

  9. spring-oauth-server实践:授权方式1、2、3和授权方式4的token对象.authorities产生方式比较

    授权方式1.2.3和授权方式4的token对象.authorities产生方式不同, 前者使用user_privillege构建, 后者直接使用oauth_client_details.authort ...

  10. django模版中配置和使用静态文件方法

    1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...