题目链接

SP11469 SUBSET - Balanced Cow Subsets

题目翻译

给出N(1≤N≤20)N(1≤N≤20)N(1≤N≤20)个数M(i)(1<=M(i)<=100,000,000)M(i) (1 <= M(i) <= 100,000,000)M(i)(1<=M(i)<=100,000,000),在其中选若干个数,如果这几个数可以分成两个和相等的集合,那么方案数加1。问总方案数。

思路:
如果折半搜出的两个序列数字都相等的话是会被卡爆的,这是我们就需要更稳更好打的方法。

我们换个角度考虑,N只有区区20,所有选或不选的方案数只有2N=1e62^N\ = \ 1e62N = 1e6,如果在两次搜索就把每种选的情况可行性做出来,就可以解决问题。

第一次搜索时,我们记录每一种结果可以被哪些组合拼出来(N==20N == 20N==20,组合状态是可以压缩的)。当然一种结果可能被多个组合拼出来,所以要用vector记录,而一个结果也可能很大,需要用map离散化(编个号就行,不用排序)。

那么第二次搜索时,每当我们得到一个结果S,我们是需要前一半产生-S的总和来得到方案的,显然-S的方案就是S的方案反过来而已,是完全等效的,那么我们遍历第一次搜到的所有能使前一半算出S的方案,他们的组合与后一半的组合并在一起就是一个可能的答案。
思路来源%%%

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2000000+7;//范围2^20
ll v,n,m,ans,a[100],use[N],mx,mc;
vector<ll>d[N];
map<ll,ll>mp;
inline void dfs1(ll i,ll sum,ll now)//now为压缩状态(状压),sum为当前的总和
{if(i>mx){if(!mp.count(sum))mp[sum]=++mc;//(伪)离散化d[mp[sum]].push_back(now);//当前now可以拼出sum的和return;}dfs1(i+1,sum,now);//选择当前dfs1(i+1,sum+a[i],now|(1<<(i-1)));//选左边第1组dfs1(i+1,sum-a[i],now|(1<<(i-1)));//选右边第2组
}
inline void dfs2(ll i,ll sum,ll now)
{if(i>n){if(mp.count(sum)){ll x=mp[sum];//寻找前一半(左边)能拼出-sum的组合(利用map映射)for(int i=0;i<d[x].size();++i)use[d[x][i]|now]=1;//两边一组合就是一个可能的结果个}return;}dfs2(i+1,sum,now);dfs2(i+1,sum+a[i],now|(1<<(i-1)));dfs2(i+1,sum-a[i],now|(1<<(i-1)));
}
int main()
{scanf("%lld",&n);mx=n>>1;//n/2for(int i=1;i<=n;++i)scanf("%lld",&a[i]);dfs1(1,0,0),dfs2(mx+1,0,0);//先dfs左边一半,再dfs右边一半,(n/2+1)for(int i=1;i<=1<<n;++i)//遍历每一种情况ans+=use[i];printf("%lld\n",ans);
}

SP11469 SUBSET - Balanced Cow Subsets(折半搜索+状态压缩)难度⭐⭐⭐⭐★相关推荐

  1. 【算法练习】动态规划/搜索/状态压缩 百练poj4124:海贼王之伟大航路

    参考链接:https://www.twblogs.net/a/5b8ceaac2b7177188336e93d/zh-cn 题目链接:http://bailian.openjudge.cn/pract ...

  2. P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索

    传送门 文章目录 目录 题意: 思路: 目录 题意: 给你nnn个数,从中任意选出一组数,使这些数能分成和相等的两组,问有多少种选数方案. 2≤n≤20,1≤ai≤1e92\le n\le 20,1\ ...

  3. BZOJ.2679.Balanced Cow Subsets(meet in the middle)

    BZOJ 洛谷 \(Description\) 给定\(n\)个数\(A_i\).求它有多少个子集,满足能被划分为两个和相等的集合. \(n\leq 20,1\leq A_i\leq10^8\). \ ...

  4. BZOJ 2679 [Usaco2012 Open]Balanced Cow Subsets

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2679 题解 meet in the middle,枚举左边放在第一个集合,第二个集合还是 ...

  5. J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩

    J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...

  6. 【BZOJ2246】【codevs2135】迷宫探险,概率DP+记忆化搜索+状态压缩+运气

    Time:2016.08.24 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 毒瘤题目 考虑f[i][x][y][h]f[i][x][y][h]表示走到(x,y),血量 ...

  7. [折半搜索][has] Jzoj P4250 路径

    Description A国有n个城市,编号为1到n,任意两个城市之间有一条路.shlw闲得没事干想周游A国,及从城市1出发,经过且仅经过除城市1外的每个城市1次(城市1两次),最后回到城市1.由于s ...

  8. bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)

    1770: [Usaco2009 Nov]lights 燈 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1153  Solved: 564 [Sub ...

  9. 【折半搜索-经典题目】中山纪念中学暑期游Day13——【GDOI2017模拟8.15】Buy

    前言 考试时有道题目用到了[折半搜索] 老师推荐了这道经典题目让大家练习[前后部分算法不同]的题目 虽然不知道我有没有时间做,好歹先把题目记录一下,免得以后找不到了qwq 题目 Input Outpu ...

最新文章

  1. 基于ArcSDE的影像数据管理-疑惑篇 (转载)
  2. string:值类型?引用类型?[转]
  3. Django之ORM操作
  4. SAP 电商云 Spartacus Maintenance branch
  5. CF938G Shortest Path Queries(线性基,线段树分治,并查集)
  6. supervisor 守护多个进程_进程管理工具之Supervisor
  7. ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分
  8. php语法介绍,PHP语法介绍
  9. Myeclipse学习总结(16)——MyEclipse CI 2018.8.0首次更新,全新来袭!(内附破解激活文件,亲测破解100%)
  10. 初中英语听力软件测试,初中英语听力训练
  11. Fedora Linux基本配置
  12. 显示表格数据网页php源码,网页上可以复制的表格数据,为什么察看源代码找不到这些数据?_html/css_WEB-ITnose...
  13. linux命令mount是什么,Linux命令——mount、umount
  14. python培训班视频 网盘
  15. css判断手机端还是pc端,JavaScript判断设备是手机端还是PC端,并加载不同的css/js文件...
  16. 软件测评师--第九小时 web应用测试
  17. 子列和列_最大子列和
  18. 第四章第6节水管工游戏
  19. odoo学习笔记(一)
  20. C语言学习笔记(浙大翁恺版)第一周

热门文章

  1. 用局部条件图集建模三维曲面流形
  2. 讨论:对于神经网络,不需要弄明白原理,只需要应用,是这样吗?
  3. Hadoop数据仓库工具——Hive
  4. 使用webpack构建多页应用
  5. WEB 测试点总结
  6. JavaWeb学习笔记——DOM4J
  7. iOS 之 UICollectionView
  8. MongoDB 计划缓存的影响
  9. VS 常见快捷键(转)
  10. 去Tech Ed得计划好