首页 > 其他分享 >容斥原理

容斥原理

时间:2023-07-12 20:12:30浏览次数:35  
标签:int ll 容斥 long 原理 dp

 容斥原理的原式有两个,分别是第一形式:|A U B|=|A|+|B|-|AB|

                                                   第二形式:|A U B U C|=|A|+|B|+|C|-|AB|-|AC|-|BC|+|ABC|

容斥原理最经典的应用是与dp相结合

下面给出一道例题:

P1450 [HAOI2008] 硬币购物

将多重背包与容斥原理相结合,大大提升时间复杂度

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+39+7;
ll dp[N];int c[4],d[4];
int main(){
	for(int i=0;i<4;i++)cin>>c[i];
	dp[0]=1;
	for(int i=0;i<4;i++){
		for(int j=c[i];j<N;j++){
			dp[j]+=dp[j-c[i]];
		}
	}
	int T;cin>>T;
	while(T--){
		for(int i=0;i<4;i++)cin>>d[i];
		int s;cin>>s;
		ll ans=dp[s];
		for(int i=1;i<=15;i++){
			int now=s,tmp=i,opt=0;
			for(int j=0;tmp;j++){
				if(tmp&1)opt^=1,now-=(d[j]+1)*c[j];
				tmp>>=1;
			}
			if(now<0)continue;
			if(opt)ans-=dp[now];
			else ans+=dp[now];
		}
		cout<<ans<<'\n';
	}
	return 0;
}

  

标签:int,ll,容斥,long,原理,dp
From: https://www.cnblogs.com/zhanghx-blogs/p/17548698.html

相关文章

  • 记录--你知道Vue中的Scoped css原理么?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助追忆Scoped偶然想起了一次面试,二面整体都聊完了,该做的算法题都做出来了,该背的八股文也背的差不多了,面试官频频点头,似乎对我的基础和项目经验都很是满意。嗯,我内心os本次面试应该十拿九稳了。突然,面试官说:「我的......
  • BOSHIDA DC电源模块过载保护的原理
    BOSHIDADC电源模块过载保护的原理DC电源模块过载保护的原理是通过电路设计和控制算法来实现的,其基本思想是在系统发生过载时,通过控制电路的工作状态和输出特性,实现对输出电流的限制和保护。具体来说,DC电源模块的过载保护主要包括两个方面:一是电流保护,即控制输出电流的大小和稳......
  • Unix C的Http服务器技术实现原理
    基于tiny-httpd的一个httpserver,可处理GET和POST请求。知识范围:POSIX接口pipe(intarr[2])pipe(intarr[2]);使用pipe会创建通道,arr[0]为读,arr[1]为写。dup2-复制文件描述符这个fd我目前理解是用来读数据的,使用dup2相当于直接复制了oldfd对应的数据dup2(oldfd,newfd)......
  • VRRP的原理及配置
    目录一、VRRP的定义1.VRRP的基本概念2.VRRP的设备类型3.VRRP的工作原理4.状态机的优先级VRRP的实验配置一、VRRP的定义1.VRRP的基本概念VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现网关的备份。协议版本......
  • 鸽巢原理
     鸽巢原理的生活原型:k*n+1只鸽子住在n个巢里,至少有一个巢里有k+1只或更多鸽巢原理的加强形式:令q1,q2,......,qn为正整数,如果将q1+q2+q3+......+qn-n+1个水果放入n个盒子,或者第一个盒子至少有q1个水果......鸽巢原理的拓展——Ramsey定理:在6人中,或者有3人,每两人的互相认识;或者......
  • JUC包常用类原理
    概要放眼望去,java.util.concurrent包下类大致包括:atomic原子类、锁、并发集合、线程池、工具类。我们挑重要的了解一下。Atomic原子类Java针对并发编程已经有了各种锁,为什么还需要原子类?原子类一定有些特别的应用场景?在很多时候,我们需要的仅仅是一个简单的、高效的、线程安......
  • 计算机cpu的多级缓存简单原理
    缓存级别L1高速缓存(最快内存),一般分为两种方式:指令缓存和数据缓存;一般大小在256KB~1MB之间。L2叫L1缓存慢,比L1会更大些,一般大小在256KB~8MB之间。L3最大的高速缓存存储单元,也是最慢的一个。它的范围从4MB到50MB以上。数据会从RAM依次流到L3高速缓存,然后是L2,最后是L1查找时,会......
  • InnoDB自增原理都搞不清楚,还怎么CRUD?
    虽然我们习惯于给主键ID指定AUTO_INCREMENT属性,但是AUTO_INCREMENT也是可以指定到非主键字段的,唯一的约束就是这个字段上面得加索引,有了索引,就可以通过类似SELECTMAX(*ai_col*)的语句快速读到这列数据的最大值。本文要探讨的话题是MySql的InnoDB引擎处理自增数据列的原理MySql5.1......
  • 77.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?
    77.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?1.指针参数传递本质上是值传递,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。值传......
  • 基于生长的棋盘格角点检测方法--(1)原理介绍
    前言棋盘格中角点检测方法是相机标定中必不可少的步骤之一。Opencv中的函数boolfindChessboardCorners(InputArrayimage,SizepatternSize,OutputArraycorners,intflags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE)就可以轻松实现棋盘格角点检测结果。如下图所示......