Description

给n个数,从中任意选出一些数,使这些数能分成和相等的两组。

求有多少种选数的方案。

Input

第\(1\)行:一个整数\(N\)

第\(2\)到\(N+1\)行,包含一个整数\(m_i\)

Output

一行:平衡的集合的个数.

看到题的一瞬间数据范围?

\(N \leq 20?\)状压!

明显直接做过不去,选择折半搜索.

折半搜索的话会有三种情况

  • 一.选择当前位置
  • 二.选择当前位置,给第一组.
  • 三.选择当前位置,给第二组.

然后直接跑折半搜索+状压即可.

存储类似链式前向星,应该不是很难理解,就不过多解释了.

然后就枚举状态即可,可是直接枚举到\(2^n-1\)显然会\(T\)掉.

由于我们后半截的状态已知,所以说,我们只需要枚举前一半的状态即可.

注意要\(sort\)找到两边力气值相等的.

其他的就不太难理解了,如果不能理解的话可以私信我 qwq.

代码

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. #define N 10000008
  5. #define R register
  6. using namespace std;
  7. inline void in(int &x)
  8. {
  9. int f=1;x=0;char s=getchar();
  10. while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
  11. while(isdigit(s)){x=x*10+s-'0';s=getchar();}
  12. x*=f;
  13. }
  14. int n,w[28],mid,head[N];
  15. struct cod{int u,val;}e[200008],edge[N];
  16. int v[N],ans,tot,ttt,sta,cnt;
  17. bool vis[2500000];
  18. void dfs1(int dep,int sum,int state)
  19. {
  20. if(dep>mid)
  21. {
  22. edge[++tot].u=head[state];
  23. edge[tot].val=sum;
  24. head[state]=tot;
  25. return;
  26. }
  27. dfs1(dep+1,sum,state);
  28. dfs1(dep+1,sum+w[dep],state|(1<<(dep-1)));
  29. dfs1(dep+1,sum-w[dep],state|(1<<(dep-1)));
  30. }
  31. void dfs2(int dep,int sum,int state)
  32. {
  33. if(dep>n)
  34. {
  35. e[++ttt].u=state;
  36. e[ttt].val=sum;
  37. return;
  38. }
  39. dfs2(dep+1,sum,state);
  40. dfs2(dep+1,sum+w[dep],state | (1<<(dep-1)));
  41. dfs2(dep+1,sum-w[dep],state | (1<<(dep-1)));
  42. }
  43. inline bool ccp(const cod&a,const cod&b)
  44. {
  45. return a.val<b.val;
  46. }
  47. int main()
  48. {
  49. in(n);mid=(n+1)>>1;sta=(1<<n)-1;
  50. for(R int i=1;i<=n;i++)in(w[i]);
  51. dfs1(1,0,0);dfs2(mid+1,0,0);
  52. sort(e+1,e+ttt+1,ccp);
  53. for(R int i=0;i<=(1<<mid);i++)
  54. {
  55. R int cnt=0;
  56. for(R int j=head[i];j;j=edge[j].u)
  57. v[++cnt]=edge[j].val;
  58. sort(v+1,v+cnt+1);
  59. R int pos=1;
  60. if(v[1]>e[ttt].val)break;
  61. for(R int j=1;j<=ttt;j++)
  62. {
  63. while(pos<=cnt and v[pos]<e[j].val)pos++;
  64. if(pos>cnt)break;
  65. if(v[pos]==e[j].val)
  66. vis[i|e[j].u]=true;
  67. }
  68. }
  69. for(R int i=1;i<=sta;i++)
  70. if(vis[i])ans++;
  71. printf("%d",ans);
  72. }
  73. /*
  74. 10
  75. 5 8 16 17 25 83 24 7 8 20
  76. 89
  77. */

折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…的更多相关文章

  1. 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...

  2. [luogu3067 USACO12OPEN] 平衡的奶牛群

    传送门 Solution 折半搜索模板题 考虑枚举每个点在左集合和右集合或者不在集合中,然后排序合并即可 Code //By Menteur_Hxy #include <cmath> #i ...

  3. POJ 2046 Gap 搜索- 状态压缩

    题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...

  4. P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

    暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...

  5. HDU-5025 Saving Tang Monk 广度搜索 状态压缩

    题目链接:https://cn.vjudge.net/problem/HDU-5025 题意 救唐僧,路上有m(<=9)把钥匙,最多5条蛇和一个唐僧. 目标是前往唐僧的地方,用全部钥匙打开全部的 ...

  6. Luogu3067 平衡的奶牛群 Meet in the middle

    题意:给出$N$个范围在$[1,10^8]$内的整数,问有多少种取数方案使得取出来的数能够分成两个和相等的集合.$N \leq 20$ 发现爆搜是$O(3^N)$的,所以考虑双向搜索. 先把前$3^\ ...

  7. Doing Homework---hdu1074(状态压缩&&记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 有n(n<=15)门课需要做作业,每门课所需时间是used_time以及每门课作业上交的最 ...

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

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

  9. loj 1011(状态压缩+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837 思路:状态压缩+记忆化搜索. #include<io ...

随机推荐

  1. C++的一些小操作、常用库及函数(持续更新)

    1. 强制保留n位小数(位数不足则强制补零) 头文件: #include <iomanip> 在输出前: cout<<setprecision(n); 也有不用头文件的方式,在 ...

  2. [Leetcode] Reorder list 重排链表

    Given a singly linked list L: L 0→L 1→…→L n-1→L n,reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→… You ...

  3. 洛谷 P1607 [USACO09FEB]庙会班车Fair Shuttle 解题报告

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  4. rest与restful

      知乎上面摘抄的,感觉不错,分享下:  https://www.zhihu.com/question/28557115 1. REST描述的是在网络中client和server的一种交互形式:RES ...

  5. hbase监控实现

    目前实现的监控概览

  6. 51nod1031(简单斐波拉契数列)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1031 题意:中文题诶- 思路:对于第x块骨牌的情况,我们用a ...

  7. RPC-整体概念

    RPC概述 RPC(Remote Procedure Call),即远程过程调用,是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议,实现调用远程主机上的方法就像调用本地方法一样. ...

  8. 不谈OI:高二(13)最后一次班班有歌声

    最后一次班班有歌声了…… 自己因为搞oi并没有参加,只是决赛的时候幕后放了放背景视频…… 不管怎么说,我们班唱的很棒啊,全部人都很棒! 说真的我为我们班骄傲 视频: https://v.qq.com/ ...

  9. HDU5772 String problem

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  10. [ZOJ2341]Reactor Cooling解题报告|带上下界的网络流|无源汇的可行流

    Reactor Cooling The terrorist group leaded by a well known international terrorist Ben Bladen is bul ...