SP11469 SUBSET - Balanced Cow Subsets(折半搜索+状态压缩)难度⭐⭐⭐⭐★
题目链接
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(折半搜索+状态压缩)难度⭐⭐⭐⭐★相关推荐
- 【算法练习】动态规划/搜索/状态压缩 百练poj4124:海贼王之伟大航路
参考链接:https://www.twblogs.net/a/5b8ceaac2b7177188336e93d/zh-cn 题目链接:http://bailian.openjudge.cn/pract ...
- P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
传送门 文章目录 目录 题意: 思路: 目录 题意: 给你nnn个数,从中任意选出一组数,使这些数能分成和相等的两组,问有多少种选数方案. 2≤n≤20,1≤ai≤1e92\le n\le 20,1\ ...
- BZOJ.2679.Balanced Cow Subsets(meet in the middle)
BZOJ 洛谷 \(Description\) 给定\(n\)个数\(A_i\).求它有多少个子集,满足能被划分为两个和相等的集合. \(n\leq 20,1\leq A_i\leq10^8\). \ ...
- BZOJ 2679 [Usaco2012 Open]Balanced Cow Subsets
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2679 题解 meet in the middle,枚举左边放在第一个集合,第二个集合还是 ...
- J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩
J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...
- 【BZOJ2246】【codevs2135】迷宫探险,概率DP+记忆化搜索+状态压缩+运气
Time:2016.08.24 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 毒瘤题目 考虑f[i][x][y][h]f[i][x][y][h]表示走到(x,y),血量 ...
- [折半搜索][has] Jzoj P4250 路径
Description A国有n个城市,编号为1到n,任意两个城市之间有一条路.shlw闲得没事干想周游A国,及从城市1出发,经过且仅经过除城市1外的每个城市1次(城市1两次),最后回到城市1.由于s ...
- bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
1770: [Usaco2009 Nov]lights 燈 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1153 Solved: 564 [Sub ...
- 【折半搜索-经典题目】中山纪念中学暑期游Day13——【GDOI2017模拟8.15】Buy
前言 考试时有道题目用到了[折半搜索] 老师推荐了这道经典题目让大家练习[前后部分算法不同]的题目 虽然不知道我有没有时间做,好歹先把题目记录一下,免得以后找不到了qwq 题目 Input Outpu ...
最新文章
- 基于ArcSDE的影像数据管理-疑惑篇 (转载)
- string:值类型?引用类型?[转]
- Django之ORM操作
- SAP 电商云 Spartacus Maintenance branch
- CF938G Shortest Path Queries(线性基,线段树分治,并查集)
- supervisor 守护多个进程_进程管理工具之Supervisor
- ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分
- php语法介绍,PHP语法介绍
- Myeclipse学习总结(16)——MyEclipse CI 2018.8.0首次更新,全新来袭!(内附破解激活文件,亲测破解100%)
- 初中英语听力软件测试,初中英语听力训练
- Fedora Linux基本配置
- 显示表格数据网页php源码,网页上可以复制的表格数据,为什么察看源代码找不到这些数据?_html/css_WEB-ITnose...
- linux命令mount是什么,Linux命令——mount、umount
- python培训班视频 网盘
- css判断手机端还是pc端,JavaScript判断设备是手机端还是PC端,并加载不同的css/js文件...
- 软件测评师--第九小时 web应用测试
- 子列和列_最大子列和
- 第四章第6节水管工游戏
- odoo学习笔记(一)
- C语言学习笔记(浙大翁恺版)第一周