jzoj4841 平衡的子集
来源:互联网 发布:php高并发web架构 编辑:程序博客网 时间:2024/04/29 05:31
问题描述
有n个数,问有多少种从其中选若干个数的合法方案。
一个合法方案是指,选出来的数可以分为两组,使得两组之和相等。
对于100%的数据满足:2<=N<=20,1<=a[i]<=100000000
解
一开始还理解错题意了(2次),一开始以为是所有数都要分组,然后以为问的是有多少种分组方案使得和相等。
看到20想到的就是状压和折半搜索(Alan给我们口胡的那个东西)。
先把20个数分成两半。
我们显然可以知道,如果一边选的和是l,r,另一边选的和是ll,rr,那么当l-r=ll-rr时,这可以拼成一种合法的方案。
于是我们暴搜一边,存下一个差x的所有可能选法(要判重,不然理论时间过不了)。对于一种选法可能会有
对于另外一边,我们每找到一个差y,去找对应的差x’=y,然后枚举x’的所有可能状态,合并判重。这一步的时间复杂度是
不带判重水过的
#include <cstdio>#include <iostream>#include <cstring>#define maxn 21#define mo 9000007#define lim 4000000000LLtypedef long long ll;using namespace std;struct hashMap{ ll ht[mo]; ll hash(ll x) { int rt=x%mo; while (ht[rt]!=-lim && ht[rt]!=x) { rt++; if (rt>=mo) rt=0; } ht[rt]=x; return rt; } hashMap() { for (int i=1; i<mo; i++) ht[i]=-lim; }} h;int n,a[maxn],mid,tmpl;int tot,head[mo],next[mo],bit[mo];int cnted[2000][2000];ll ans;void link(int x,int y) { bit[++tot]=y; next[tot]=head[x]; head[x]=tot;}void dfs(int x,ll l,ll r,ll st) { if (x==mid+1) { if (l-r<0) return; tmpl=h.hash(l-r); link(tmpl,st); return; } dfs(x+1,l,r,st<<1); dfs(x+1,l+a[x],r,(st<<1)+1); dfs(x+1,l,r+a[x],(st<<1)+1);}int k;void dfs2(int x,ll l,ll r,ll st) { if (x==mid) { if (l-r<0) return; k=h.hash(l-r); for (int i=head[k]; i; i=next[i]) { if (cnted[bit[i]][st]==0) { cnted[bit[i]][st]=1; ans++; } } return; } dfs2(x-1,l,r,st<<1); dfs2(x-1,l+a[x],r,(st<<1)+1); dfs2(x-1,l,r+a[x],(st<<1)+1);}int main() { freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); cin>>n; for (int i=1; i<=n; i++) scanf("%d",&a[i]); mid=n/2; dfs(1,0,0,0); dfs2(n,0,0,0); cout<<ans-1<<endl;}
0 0
- JZOJ4841 平衡的子集
- jzoj4841 平衡的子集
- [JZOJ4841] 平衡的子集
- 【JZOJ4841】平衡的子集
- Jzoj4841 平衡的子集
- 【jzoj4841】【平衡的子集】【搜索】
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
- {题解}[jzoj4841]【NOIP2016提高A组集训第4场11.1】平衡的子集
- 【JZOJ 4841】平衡的子集
- 【JZOJ 4841】平衡的子集 口胡题解
- JZOJ 4841【NOIP2016提高A组集训第4场】平衡的子集
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
- 平衡的子集 【NOIP2016提高A组集训第4场11.1】
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
- 子集构造 集合的子集合
- 求解集合的子集
- 求集合的子集
- 序列的子集
- Java线程池的分析和使用
- android 设置控件的透明度
- 怎么让java项目打印日志
- 【Codeforces Beta Round #37】Codeforces 37E Trial for Chief
- 实验7-二叉树
- jzoj4841 平衡的子集
- Python学习笔记(2)
- 更新GitHub上自己 Fork 的代码与原作者的项目进度一致
- Selenide+cucumber整合到Jenkins
- v4l2基础学习一
- SDL_UpdateRect函数
- Caffe的依赖
- 测试工作中常用到的sql命令!!!
- cs231n学习笔记-CNN-目标检测、定位、分割