排列组合&容斥
排列组合
-
排列组合的题目,一般看起来都很复杂,但都可以拆分成一个个最基本的小问题,再通过加法原理&乘法原理合并。
-
当然,如果有时候正向拆分很困难,可以试试反向拆,即所有情况-不满足的情况(这种容斥思想会在下面详细说明)
-
分析小问题时弄清楚条件:是不是小球放进盒子的类型?有没有编号?可不可以有空盒?...
-
小练手:
-
问题一:
一副种取值,种花色的扑克,从中选5张,求两对同值的方案数
-
先考虑同值的是哪两种值,共种方案
-
而对于每一种取值取两张,都有种方案
-
最后一张牌,要与前面的两种取值不同,就是方案,
-
相乘即可。
-
-
问题二:
有个男生,个女生,名老师排队,求满足条件的方案数
1.两个女生不能相邻
2.老师也不能相邻
-
方法一:
- 思考:因为老师不能相邻,所以他们之间一定夹了学生,又因为女生不能相邻,所以老师之间要么夹了一个女生,要么夹了一个男生和其它学生(也可以没有其它学生)
- 如果两老师中间夹了一个女生:把这三个人当1个男生,问题转化为:个男生中插个女生的方案数乘上,即。
- 两老师之间夹了一个男生和其它学生:考虑先在个男生中差两个老师,然后再在这个人中插个女生,答案为
- 最后相加。
-
方法二:
- 满足条件的方案=满足条件1的所有方案-满足条件1且不满足条件2的方案。
- 满足条件1的所有方案:将老师看作2个男生,问题转化为“个男生中插个女生的方案数”,即。
- 满足条件1且不满足条件2的方案:将老师绑在一起(绑法有两种),看作1个男生,问题转化为“个男生中插个女生的方案数乘上2”,即。
- 最后相减。
-
-
-
组合意义
通过对问题组合意义的分析,可以快速对复杂问题化简,不过还是得注意细节,不然很容易出错。-
问题一:
从只能向上或向右走到的方案数。
- 其实就是对步决策向上或右中选个向上或个向右,所以答案为或。
-
问题二:
证明
- 先将转化为走路问题,原式就转化为"从走到的方案数"=从走到的方案数
- 而从走到可以转化为从到达之后向右一步,然后一直向上。所以就是上面式子所表达的。
-
问题三:
允许重复的组合:从中选个元素,并且允许重复选取一个元素多次的方案数。
- 把问题转化为:把这个元素进行划分,分成个部分(可以为空),。并且把分成的段分别是集合中的第个元素,如果这一段是空的就表示没有选第个元素(因为集合并不要求)。
- 发现如果个部分都不能为空,那就可以运用插板法,在个元素的个空格之间选个插上隔板,作为分组的端点。
- 而因为分组可以为空,我们可以先加入个额外的元素,参与插板。这样,在最后分好的个部分每个都减1个元素。这样就可以转化为可以为空的插板问题。
- 所以答案为
-
问题四:
有个元素的集合和整数,从中选取个子集,构成一个边长为的三角形:
......
要求满足的子集选取方案数 -
由于集合的各个元素是不同的,也可以说各个元素之间是相互独立的,那么我们就可以单独对每一个元素考虑。
-
而如果没有当前的元素,那么以为左上角,为右下角的矩形所覆盖的区域都应该没有这个元素。
-
如此一来,如果我们将有有这个元素的区域和没有这个元素的区域画上一条分界线,如图:
-
如果以左下角为原点建立坐标系,感觉这条分解线一定会经过和,并且一定是向上或向右坐标不断递增的,为什么呢?
-
可以自己想象一下,在一个个矩形的覆盖下:一定不会向凹的情况,并且设是最小的无元素的子集,那么一定是没有这个元素的,那么对应的分界线也就会到的左上角,也就是
-
这样,问题就转化为了求从走到的方案数的问题
-
发现,无论为多少,都要走步,那么就可以把问题看做是有个决策,每次向上或向右,方案数自然是。个独立的元素方案数相乘,所以答案就是。
-
同时,这也解释了
-
-
容斥
-
容斥解决的是满足多个条件的方案数的问题,这里可以把每个条件转化为集合,例:
- :所有情况的方案数
- :满足条件的方案数
- :满足任一一个条件的方案数
- :全部条件都满足的方案数
-
容斥的核心思想是对“至少(至多)”和“恰好(一般是)”之间的转换,重点是弄清楚哪种方案数容易求,相关的式子如下:
-
问题一:
种烹饪方法,且会使用 种主要食材
使用烹饪方法 和主要食材 会做 道不同的菜
对于一种包含 道菜的搭配方案而言,要求:
-
每道菜的烹饪方法互不相同
-
每种主要食材至多在一半的菜(即 道菜)中被使用
求搭配方案数
- 先分析要求一,要求烹饪方法互不相同,感觉可以依次考虑对每种烹饪方法进行决策,在当前烹饪方法做不做菜?用哪种主要食材做?然后记录当前状态,以及决策对当前状态的影响,这就是一个dp了。
- 可是发现要求二根本不好表示状态,因为对于每种食材都要满足条件,即。但发现不满足条件二的方案很好求,即,因为只能有一种主要食材会超过一半,在dp时只需要记录一个主要食材的选用次数就可以了。
- 于是考虑第二个式子。通过dp计算满足要求一的所有情况数,和满足要求一而不满足要求二的方案数。
- 注意此题dp状态需要优化,但与本次主题关联不大,故不展开分析。
-
-
问题二:
一个的棋盘,用种颜色染色,求满足条件的方案数
- 棋盘的每一个小方格既可以染色(染成种颜色中的一种),也可以不染色。
- 棋盘的每一行至少有一个小方格被染色。
- 棋盘的每一列至少有一个小方格被染色。
- 每种颜色都在棋盘上出现至少一次。
- 看上去很难,既要考虑颜色,又要考虑每一行,每一列,感觉特别不可做...
- 我们先将颜色单独考虑。
- 发现“出现至少一次”可以看成每种颜色都要用,即,而我们发现如果有某几种颜色不用,其它颜色不考虑用不用的方法好像很好求((其它颜色数+1)^要填的格子数),即。通过式子一和式子二共同转化,
*的意义是所有组个颜色不用的方案数,组数就是种颜色中选种颜色,即组,为了表述方便,我们设表示在棋盘上用最多用种颜色满足要求一、二的方案数(这个待会去求),而一组的答案就为,与组数相乘即可,而全集是(最多用种颜色就是所有情况)。所以答案为 - 类似的,计算的时候所要考虑的要求一、二,也可以通过上面的容斥分析得到。还是通过上面的式子转化,不过此时的就是所有组列完全不涂色的方案数,一组的答案这么统计:对每一行单独考虑,答案数为,可是一行不能全为空,就要减去一,行都是独立的,相乘就是。这里全集就是当时的值(0列完全不涂色就是所有的情况),所以
- 综合起来就可以了。
本文作者:qwq_123
本文链接:https://www.cnblogs.com/qwq-123/p/15905690.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?