[转]容斥原理与多重集合{理论}

本文转自http://blog.csdn.net/ACdreamers/article/details/9923955

原博主:ACdreamers

首先介绍一个重要定理:

设S是有k种类型对象的多重集合,每种元素均具有无限的重复数。那么S的r组合的个数等于:

问题一:多重集合的组合问题

问题描述:给定3个a,4个b,5个c,现在要选10个元素,求一共有多少种组合?

分析:本问题就是相当于求S={3·a,4·b,5·c}的10组合数。

首先,多重集合的组合有一个定理,定理描述如下:

设S是有k种类型对象的多重集合,每种元素均具有无限的重复数,那么S的r组合的个数等于:

那么既然这样,我们令S∞={∞·a, ∞·b,∞·c},那么S的10-组合数为

设集合A是S∞的10-组合全体,则|A|=66,现在要求在10-组合中的a的个数小于等于3,b的个数小于等于4,c的个数小于等

于5的组合数.

定义性质集合P={P1,P2,P3},其中: 

P1:10组合中a的个数大于等于4;

P2:10组合中b的个数大于等于5;

P3:10组合中c的个数大于等于6;

将满足性质Pi的10-组合全体记为Ai(1≤i≤3).

那么,A1中的元素可以看作是由S∞的10-4=6组合再拼上4个a构成的,所以

同理有:

 

所以根据容斥原理,原问题的解为:

 

问题二:方程解的个数问题

(1)问题描述:已知非负整数不大于7,求方程整数解的个数。

 

分析:其实用容斥,跟上题一样,先求出总数,因为不可能出现两个或两个以上的数大于等于8,所以这里就简单很多了。

首先,S的10-组合数为:,由于只会出现中的一个大于等于8的情况,所以四种情况一样的,

其结果都是,所以问题的解就是286-4*10=246

 

(2)问题描述:求方程整数解的个数,其中

 

分析:对于这个问题需要先转化一下就跟上题一样了。

令:,然后就有,此类问题不再赘述。答案为21

 

 

问题三:集合划分问题

问题描述:将一个n元集合划分为r个非空子集,并给每个子集标上号1,2,3,...r,求划分方案数。

分析:设S为将n元集划分成有序r部分的全部划分方案集,注意这里每一部分可以为空,那么我们用总数减去为空的情况就可

以了,那么进一步有一个不为空,两个不为空,三个不为空,...等等。这样我们就可以容斥。

我们知道 ,, 

所以最后得到方案数为:

时间: 2024-07-31 15:14:49

[转]容斥原理与多重集合{理论}的相关文章

multiset多重集合容器

跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入.元素的搜索依旧具有对数级的算法时间复杂度,find和equal_range函数能够搜索出某一键值下的全部元素位置. 创建multiset对象 有下面几种方式. (1)    multiset() multiset<int> ms; (2)    multiset(constkey_compare&cmp) //student结构体 structstuden

第12章 multiset多重集合容器

/* 第12章 multiset多重集合容器 12.1 multiset技术原理 12.2 multiset应用基础 12.3 本章小结 */ // 第12章 multiset多重集合容器 // 12.1 multiset技术原理 ---------------------------------------------------------------------------- // 12.2 multiset应用基础 ------------------------------------

2017.3.10组合数学学习——多重集合的排列

多重集合的排列定理:设S是多重集合,他有k种不同类型的对象,每一种类型的有限重复数是n1,n2,n3,…nk.设S的大小为n=n1+n2+n3+…nk.则S的n排列数目为n!/(n1!n2!n3!…nk!)证明:先从S中选出n1个位置放a1,有C(n,n1)种放法,再选出n2个位置放a2,有C(n-n1,n2)种放法……由乘法原理得:S的排列个数=C(n,n1)*C(n-n1,n2)*C(n-n1-n2,n3)*…*C(n-n1-n2-…-nk-1,nk)∵C(n,r)=p(n,r)/r!=n!

STL多重集合multiset

导语:今天看IOI2004的论文集,学到了一种集合函数,顺便把它记录下来,一位很牛的学长关于此集合写的很详细,可以参考他的博客链接click here~~ 例题:支付帐单: 题目描述 比尔最近遇到了一件麻烦事.每天上午,他会收到若干张帐单(也可能一张也没收到),每一张都有一定的面额.下午,他会从目前还没有支付的帐单中选出面额最大和最小的两张,并把它们付清.还没有支付的帐单会被保留到下一天.现在比尔已经知道他每天收到帐单的数量和面额,请你帮他给出支付的顺序. 约束条件 天数的上限为30,000,每

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器 多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入.其结构示意图如下: 1.multiset元素插入 #include <iostream> #include <stdio.h> #include <vector> #include <set> #include <string> usi

C++STL之multiset多重集合容器

multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明头文件包含"#include<set>", 由于它包含重复元素, 所以, 在插入元素, 删除元素, 查找元素上较set有差别. 1.1multiset元素的插入 下面这个程序插入了重复键值"123", 最后中序遍历了multiset对象. #include&

HDU 3037 Saving Beans 多重集合的结合 lucas定理

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3037 题目描述: 要求求x1 + x2 + x3 + ...... + xn <= m 非负整数解的个数, 结果对P取模, 输入的变量是n, m, p, P一定是素数 解题思路: x1 + ... + xn = m 非负整数解的个数是C(n+m-1, n) , 所以答案就是 C(n+0-1, 0) + C(n+1-1, 1) + ...... C(n+m-1, n) 对P取模, 由于组合数公式C(

【集合论】 02 - 集合与自然数

1. 公理系统 先来看看康托尔对集合的定义:“一个集合是我们知觉中或理智中的.确定的.互不相同的事物的一个汇集,被设想为一个整体”.尽管康托尔本人已经建立起了相当广泛而深刻的集合理论,但对于集合本身的定义却还是含糊的,他的理论被称为“朴素集合论”(Native Set Theory).虽然试图描述集合的每个属性,但其中“汇集”.“整体”等词其实是和“集合”等价的.定义的含糊使得各种悖论趁虚而入,这也成为反对者们的主要攻击目标.之后,策梅洛(Zermelo)为集合建立了一套公理化系统,并由弗兰克尔

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实