首页 > 其他分享 >bitset优化01可行背包

bitset优化01可行背包

时间:2023-08-26 16:25:14浏览次数:41  
标签:01 二进制 ll 背包 bitset 能取

例题传送门:『STA - R3』Aulvwc

先讲bitset用法:

1,基础

下标:\(5~4~3~2~1~0\)

数字:\(0~0~0~0~1~0\)

\(bitset\)<\(n\)> \(s\)表示一个\(n\)位的二进制数,空间复杂度:\(O(\frac{n}{32})\),可见其非常优秀

因为其跟二进制有关,所以可以使用\(\&,|,\land\)对两个位数相同的\(bitset\)执行按位与,或,异或运算。

当然也可以使用\(<<,>>\)对其进行左移和右移

\(==,!=\)也可以比较两个位数相同的\(bitset\)代表的二进制数是否相等

2,特有的

\(s.count()\)返回二进制串中\(1\)的个数

\(s.set()\)把\(s\)的所有位变成\(1\)

\(s.set(k,v)\)或\(s[k]\)把\(s\)的第\(k\)位变为\(v\),其中\(v\)为\(0\)或\(1\)

\(s.reset()\)把\(s\)的第\(k\)位变为\(0\)

\(s.reset(k)\)把\(s\)的第\(k\)位变成\(0\)

\(s.filp()\)或\(s=\sim s\)把\(s\)所有位取反

\(s.filp(k)\)或\(s[k]\land=1\)把第\(k\)位取反

\(01\)背包,即背包中只有\(0\)和\(1\),一般\(f_i\)表示\(i\)这个数能否取到

正常\(01\)背包代码

f[0]=1
for(int i=1;i<=n;i++)
for(int j=m;j>=a[i];j--)
  f[j]=max(f[j],f[j-a[i]]);

但是对于每个数只有选和不选的情况下

我们考虑构建\(bitset\)<\(m\)> \(s\),其中第\(i\)位表示\(i\)能否取到

那么对于加入的\(a_i\)我们考虑我们选\(a_i\),如果我们选\(a_i\),那么代表原来能取到\(j\)的数,就能取到\(j+a_i\),因为第\(i\)位表示\(i\)能否取到,所以我们选\(a_i\)能取到的值域就是\(s<<=a_i\),不选\(a_i\)就是\(s\),所以最终的\(s\)就是\(s=(s|(s<<=a_i))\)

代码:

bitset<m> s;
s.set(0,1);
for(int i=1;i<=n;i++)
s|=(s<<a[i]);

非常快,那么例题就可用这种优化优化到\(O(qnw),w=max(a_i)\)

上代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2e3+50,M=3e6+50;
ll q,n,a[N],zh;
bool flag=false;
bitset<M> f,f1;
int main()
{
	scanf("%lld",&q);
	while(q--)
	{
		flag=false;
		zh=0;
		scanf("%lld",&n);
		for(ll i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
			zh+=a[i];
		}
		if(zh%n!=0)
		{
			puts("No");
			continue;
		}
		zh=zh/n;
		for(ll i=1;i<=n;i++)
		a[i]-=zh;
		for(ll i=1;i<=n;i++)
		if(a[i]==0) flag=true;
		if(flag)
		{
			puts("Yes");
			continue;
		}
		
		f.reset();
		f1.reset();
		f.set(0,1);
		f1.set(0,1);
		for(ll i=1;i<=n;i++)
		{
			if(a[i]<0)
			{
				a[i]=a[i]*-1;
				f=(f|(f<<a[i]));
			}
			else f1=(f1|(f1<<a[i]));
		}
		f=(f&f1);
		if(f.count()>2) puts("Yes");
		else puts("No");
	}
	return 0;
}

注意代码中\(f.count()>2\)因为\(0\)和都选一定是都能取到的,假如还有第三种能取到,那么就是\(Yes\),否则为\(No\)

标签:01,二进制,ll,背包,bitset,能取
From: https://www.cnblogs.com/pengchujie/p/17658949.html

相关文章

  • P7424 [THUPC2017] 天天爱射击
    传送门我们发现,考虑每个子弹击碎哪些木板是不现实的,所以我们要转换问题:考虑每个木板被哪个子弹击碎考虑可持久化线段树,转换问题成求区间\(l\simr\)的第s早发射的子弹,模板题上代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constllN=2e5+50,M=2e5......
  • [十二省联考 2019] 春节十二响
    题目链接。题意给出一棵有\(n\)个节点的树,要求你将集合\(\{1,2,\dots,n\}\)划分成若干个子集,使得没有子集拥有节点对满足两个元素在树上是祖孙关系。你需要最小化子集的最大值之和。先考虑带有启发性的子任务\(4\)(树是一颗链)。具体来说,树有以下两种形态:根节点是链的......
  • 801. 使序列递增的最小交换次数(状态机dp)
     dp的本质就是图论状态机dp就是包含多个待选状态,个人感觉就是分层图,每一层是一个状态,不同状态之间有可以相互转化的方法。通过状态和状态之间的关系,来实现状态转移。本题f[i][j]表示只从前i项中选,f[i][0]表示第i项不进行交换,f[i][1]表示第i项进行交换,达到严格递增情况下所需......
  • 【Matlab 教程】-01 简介
    1、背景介绍MatrixLaboratory高级编程语言许多有用的toolboxs和内置functions简单的可视化2、课程目标如何使用Matlab编写程序,通过大量实践、实验解决工程上的问题3、课程计划1.简介2.Matlab基本操作与矩阵输入3.结构化程式与自定函数4.变量与文件存......
  • 代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树
      235. 二叉搜索树的最近公共祖先    卡哥建议:相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。   题目链接/文章讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%B......
  • MBR400100CT-ASEMI肖特基模块400A 100V
    编辑:llMBR400100CT-ASEMI肖特基模块400A100V型号:MBR400100CT品牌:ASEMI封装:M2恢复时间:>50ns正向电流:400A反向耐压:100V芯片个数:2引脚数量:2类型:肖特基模块特性:肖特基模块、大功率肖特基浪涌电流:3300A正向压降:0.75V~0.85V封装尺寸:如图工作温度:-40°C~175°CMBR400100CT特性超快速切换,实......
  • MBR400100CT-ASEMI肖特基模块400A 100V
    编辑:llMBR400100CT-ASEMI肖特基模块400A100V型号:MBR400100CT品牌:ASEMI封装:M2恢复时间:>50ns正向电流:400A反向耐压:100V芯片个数:2引脚数量:2类型:肖特基模块特性:肖特基模块、大功率肖特基浪涌电流:3300A正向压降:0.75V~0.85V封装尺寸:如图工作温度:-40°C~175°CMBR400100C......
  • P3521 [POI2011] ROT-Tree Rotations
    P3521[POI2011]ROT-TreeRotations首先合并两棵子树的时候只关心子树内值的个数,并不关心子树内具体是什么顺序,引导从下向上线段树合并计算代价。每一个值只会出现一次,首先每个叶子节点开一棵动态开点值域为\(1-n\)的线段树维护,初始只有自己的值的位置为\(1\)。然后对于每......
  • P4017 最大食物链计数 (DAG拓扑排序)
    空降锣鼓1题目分析首先,要知道这道题是Topo拓扑排序。不妨先从拓扑排序定义下手,分析题目的性质。经分析得:食物链中的生物——节点生物之间的关系——有向边为了方便描述,我们将不会捕食其他生物的生产者叫做最佳生产者不会被其他生物捕食的消费者叫做最佳消费......
  • 学信息系统项目管理师第4版系列01_导读
    2023年对于信息系统项目管理师(以下简称“高项”)的考生来说真是命运多舛的一年,上半年改大纲换教材,下半年改机考换考法,真是一言难尽啊。不过,“天要下雨,娘要嫁人”,该考试拿证还是一样要考试拿证,废话也不要多说了。1.导读图基本上应该是按照图示的章节进行更新。距离11月4日考试......