上海计算机学会 2023年11月月赛 乙组T4 平分子集(三)(状态压缩 折半枚举)

第四题:T4平分子集(三)

标签:状态压缩、折半枚举
题意:一个集合被称之为可平分的,如果它可以被分为两部分,且两部分的元素之和相等。空集也算可平分的。给定一个集合 a 1 , a 2 , a 3 , … , a n a_1,a_2,a_3,…,a_n a1,a2,a3,,an,请统计它有多少子集是可平分的。(本题中所指的集合允许元素相等)( 1 < = n < = 20 , 1 < = a i < = 1 0 7 1<=n<=20,1<=a_i<=10^7 1<=n<=201<=ai<=107
题解:看到题目 n n n这么小,很容易想到暴力深搜的写法,对于每个数选或不选,然后在选择了的数中再跑一遍深搜看看,能不能分成两部分,然后两部分分别的元素之和相等,试了一下发现这样整体的时间复杂度还是比较大的,并且重复的部分不好处理。

重复的部分,我们会去想 能不能通过状态压缩 把每个数选择的情况根据二进制的情况进行处理一下。针对降低时间复杂度这部分,如果折半枚举题目写的多的同学,应该熟悉这个套路。

每个数有三种情况选择:不选、放在 A A A 集合、放在 B B B 集合。
我们设前半部分放到 A A A 集合内的所有数之和为 a a a,放在 B B B集合内的所有数之和为 b b b
我们设前半部分放到 A A A 集合内的所有数之和为 c c c,放在 B B B集合内的所有数之和为 d d d
那么, a + c = b + d a+c = b+d a+c=b+d,移项得到 a − b = d − c a-b=d-c ab=dc。( a − b a-b ab其实就是 A A A集合所有数之和减去 B B B集合所有数之和, d − c d-c dc A A A集合所有数之和减去 B B B集合所有数之和的相反数)

我们先预处理出前半部分的 a − b a-b ab情况,去存储一下所有得到当前 a − b a-b ab的状态情况(即二进制状态压缩的值),然后后半部分的时候 得到 c − d c-d cd情况的时候,去之前存储的部分 找一下有多少 − ( c − d ) = a − b -(c-d)=a-b (cd)=ab的状态。

为了避免重复,我们把着前半部分的对应值的状态和后半部分对应值的状态进行一下按位或,进行结合,标记一下这 n n n个数在选择哪些状态的情况下能够达到题目中的要求。
代码

#include <bits/stdc++.h>
using namespace std;map<int, int> m;
int n, id = 0, a[25], ans[2000005];
vector<int> e[2000005];// p: 选到第p个数
// sum: A集合所有数之和减去B集合所有数之和
// x: 当前选了哪些数, 二进制 状态压缩
void dfs1(int p, int sum, int x) {if (p > n / 2) {if (!m[sum]) m[sum] = ++id;e[m[sum]].push_back(x);return ;}dfs1(p + 1, sum, x);dfs1(p + 1, sum + a[p], x | (1<<(p-1)));dfs1(p + 1, sum - a[p], x | (1<<(p-1)));
}void dfs2(int p, int sum, int x) {if (p > n) {// 从前半部分的枚举情况下找-sum的形成状态int len = e[m[-sum]].size();for (int i = 0; i < len; i++) {// 维护实际的值的状态 避免重复ans[e[m[-sum]][i] | x] = 1;}return ;}dfs2(p + 1, sum, x);dfs2(p + 1, sum + a[p], x | (1<<(p-1)));dfs2(p + 1, sum - a[p], x | (1<<(p-1)));
}int main() {cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];dfs1(1, 0, 0);dfs2(n / 2 + 1, 0, 0);int res = 0;for (int i = 0; i < (1<<n); i++) {if (ans[i] == 1) res++;}cout << res << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress建站入门教程:phpMyAdmin4.8.5出现Fatal error: Unparenthesized错误怎么办?

我们在本地电脑使用小皮面板phpstudy安装phpMyAdmin4.8.5成功后&#xff0c;但是点击【管理】功能打开时却出现如下错误&#xff1a; Fatal error: Unparenthesized a ? b : c ? d : e is not supported. Use either (a ? b : c) ? d : e or a ? b : (c ? d : e) in D:\…

基于springboot的精准扶贫管理系统论文

精准扶贫管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了精准扶贫管理系统的开发全过程。通过分析精准扶贫管理系统管理的不足&#xff0c;创建了一个计算机管理精准扶贫管理系统的方案。文章介绍了精…

NumPy数据处理详解的笔记4

NumPy数据处理详解的笔记4 第2章NumPy与数组操作 2.1 数组形状变换函数 np.reshape与 np.resize等的区别如下 函数名 变形前后数组元素数量不一致的行为 有无参数order 元素变更的影响 np.reshape 出现运行时错误 有 …

深度学习的应用实例:从自然语言处理到计算机视觉的突破

深度学习在各个领域中展现出了强大的应用潜力&#xff0c;特别是在自然语言处理、计算机视觉、语音识别和机器翻译等方向&#xff0c;其取得的成果令人瞩目。 一、自然语言处理&#xff1a;深度学习的革命性影响 自然语言处理&#xff08;NLP&#xff09;一直是人工智能领域的…

【新书推荐】16.2 显示中断

本节内容&#xff1a;屏幕显示的实现——显示I/O中断处理程序。显示器通过显示适配卡与系统相连&#xff0c;显示适配卡是显示输出的接口。早期显示适配卡是CGA和EGA等&#xff0c;目前常见的适配卡是VGA、TVGA、DVI、DP、Mini HDMI和Micro HDMI接口等。它们都支持两类显示方式…

全量知识系统问题及SmartChat给出的答复 之19 关于演示模板

Q.60 可参考的演示模版 (word-def occupiedinterest 5type EBsubclass SEBtemplate (script $Demonstrateactor nilobject nildemands nilmethod (scene $Occupyactor nillocation nil))fill (((actor) (top-of *actor-stack*))((method actor) (t…

简洁实用的wordpress外贸网站模板

坚果蜜饯wordpress跨境电商模板 木瓜干、菠萝干、夏威夷果、芒果干、椰片、巴旦木等wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3944 珠宝手饰wordpress外贸网站模板 金银手饰、珍珠手饰、翡翠手饰、钻石手饰、玉石珠宝手饰wordpress外贸网站模板。 https:…

个人商城系统开源(登录)

原文地址&#xff1a;个人商城系统开源&#xff08;登录&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源。 也就是放在我博客右边…

2024年华为OD机试真题-最长子字符串的长度(一)-Java-OD统一考试(C卷)

题目描述: 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 o 字符出现了偶数次最长子字符串的长度。 输入描述: 输入是一串小写字母组成的字符串 输出描述: 输出是一个整数 补充说明: 1 <= s.length <= 5 x 10^5 s 只包含小写英文字母。 示例1 输入:…

小程序Taro框架 自定义底部Tabbar,处理自定义Tab栏切换卡顿、闪烁

最终效果 最近在用Taro框架开发一个小程序&#xff0c;有一个自定义底部Tabbar的需求&#xff0c;最终效果如下 起步 这页是我第一次接触自定义小程序底部Tabbar&#xff0c;所有第一选择必然是相看官方文档&#xff1a;微信小程序自定义 Tabbar | Taro 文档 &#xff08;如果…

上海亚商投顾:沪指震荡微涨 AI手机、军工板块集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡回升&#xff0c;黄白二线分化明显&#xff0c;银行等权重板块走势较强。AI手机概念股持续…

Kernel - 内核同libc的关系

内核空间中有 libc 吗&#xff1f;我的意思是&#xff0c;你必须根据某个 libc 来构建内核&#xff0c;对吗&#xff1f;那么内核空间中是否有一个 libc&#xff08;可能是静态链接的&#xff09;&#xff1f; 如果有&#xff0c;这与用户态的 glibc 有什么关系&#xff1f; 它…

欧科云链:角力Web3.0,香港如何为合规设线?

在香港拥抱Web3.0的过程中,以欧科云链为代表的合规科技企业将凸显更大重要性。 ——据香港商报网报道 据香港明报、商报等媒体报道&#xff0c;港区全国政协兼香港选委界立法会议员吴杰庄在日前召开的全国两会上提出在大湾区建设国际中小企业创新Web3融资平台等提案&#xff0…

Android SDK2 (实操三个小目标)

书接上回&#xff1a;Android SDK 1&#xff08;概览&#xff09;-CSDN博客 今天讲讲三个实际练手内容&#xff0c;用的是瑞星微的sdk。 1 实操编译Android.bp 首先还是感叹下&#xff0c;现在的系统真的越搞越复杂&#xff0c;最早只有gcc&#xff0c;后面多了make&#xf…

Flink StreamGraph生成过程

文章目录 概要SteramGraph 核心对象SteramGraph 生成过程 概要 在 Flink 中&#xff0c;StreamGraph 是数据流的逻辑表示&#xff0c;它描述了如何在 Flink 作业中执行数据流转换。StreamGraph 是 Flink 运行时生成执行计划的基础。 使用DataStream API开发的应用程序&#x…

Netty权威指南——基础篇4 网络通信基础 备份

1 TCP粘包/拆包 TCP是个“流”协议&#xff0c;所谓流&#xff0c;就是没有界限的一串数字。可以想象河里流水&#xff0c;是连成一片的&#xff0c;其间没有分界线。TCP底层并不了解上层业务数据的具体含义&#xff0c;它会根据TCP缓冲区的实际情况进行包的划分&#xff0c;一…

OpenHarmony教程指南—Navigation开发 页面切换场景范例

简介 在应用开发时&#xff0c;我们常常遇到&#xff0c;需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理&#xff0c;它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载&#xff0c;navPathSta…

【算法笔记】LeetCode_3 无重复字符的最长字串

LeetCode_3 无重复字符的最长字串 LeetCode_3 无重复字符的最长字串 题目要求 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 ** **的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为…

onlyoffice监听https

修改onlyoffice 在开始将您的ONLYOFFICE Docs切换到HTTPS协议之前&#xff0c;您需要创建一个安全证书和证书私钥。将它们放到安装ONLYOFFICE Docs的计算机上的一个文件夹中。 获得证书后&#xff0c;请执行以下步骤&#xff1a; 所有命令都应以管理员权限执行。要以管理员身份…

Redis中的整数集合数据结构为什么不支持降级操作?

Redis 的整数集合&#xff08;intset&#xff09;数据结构是用来存储整数值的集合&#xff0c;它可以存储 16、32 或 64 位的整数值&#xff0c;并且会根据存储的整数的大小自动调整内部存储的位数&#xff0c;以节省空间。例如&#xff0c;如果一个整数集合当前只包含 16 位的…