很多排列组合问题, 都可以抽象为: 从a个小球中, 选出若干个, 放到b个盒子里, 问所有放法的总方案数
盒子里的元素, 是不分次序的! 这是一条公理, 因为盒子的定义就是这样
比如, 一个盒子里放了(a, b)
, 那么, 至于里面是怎么排序的[a, b]
还是[b, a]
?
这是不关注的, 也是不分的, 都是属于一个方案.
盒子会有容量限制, 比如至少放1个
或最多放k个
或放任意个
…
不管盒子是否是相同的, 盒子之间 是不存在次序问题的!
即同一种方案(即, 小球已经放入盒子里了), 盒子的次序是无关量, 也不存在盒子排列问题
针对小球, 分为: 所有小球相同
和 所有小球不同
小球是否相同, 如何区分呢?
比如, 有2
个不同的盒子A, B
, 有两个小球a, b
, 要求: 将所有小球放入盒子里, 每个盒子可以放任意个
如果是: 相同的小球, 即(a, b
相同)
总方案有: A( 1个), B( 1个)
, A( 0个), B( 2个)
,A( 2个), B( 0个)
, 共有3个方案
可以发现, 当小球是相同的时, 我们已不关心小球标识, 而只需关注小球的个数!!
虽然小球id标识有a, b
, 但是到了这个问题里, 标识就清除掉了, 一视同仁
比如对于: A( 1个), B( 1个)
, 至于A
里面是a 还是 b
, 不关心, 这属于是1个方案
如果是: 不同的小球, 即(a, b
不同)
总方案有: A( a), B( b)
, A( b), B( a)
, A( 0个), B( ab)
,A( 2个), B( ab)
, 共有4个方案
此时小球就有id标识了, 但是要注意A( ab)
, 这里面是不分次序的, 这是盒子的定义
针对盒子, 分为: 所有盒子相同
和 所有盒子不同
盒子是否相同, 如何区分呢?
比如, 有2
个不同的小球a, b
, 有2
个盒子A, B
. 要求: 将所有小球放入盒子里, 每个盒子可以放任意个
如果是: 相同的盒子, 即(A, B
相同)
总方案有: 一个盒子里( a), 另一盒子( b)
, 一个盒子里( 0个), 另一盒子( ab)
, 共有2个方案
可以发现, 我们此时的称呼为 一个盒子, 另一个盒子...
, 与盒子的A, B
标识无关
如果是: 不同的盒子, 即(A, B
不同)
总方案有: A( a), B( b)
, A( b), B( a)
, A( 0个), B( ab)
,A( ab), B( 0个)
, 共有4个方案
此时盒子就有id标识了
对于同一个小球与盒子模型
, 根据其盒子是相同的
或不同的
, 可以判定其是否是线性有关的
如果所有盒子都是相同的
, 他是线性无关的
. 因为所有盒子是相同的, 任何次序都属于一个方案
反之, 所有盒子是不同的
, 称其为线性相关
的. 因为盒子是不同的, 其次序是重要的
这里的次序
, 并不是盒子的排放的次序(上面讲过, 小球与盒子模型中, 盒子间是没有次序关系的
这里的次序
, 是所有小球
在各个盒子中, 摆放的序列
比如有3
个不同的盒子: B1, B2, B3
将其转化为线性序列
, 非常简单, 令线性序列为: S: [S1, S2, S3]
将B1, B2, B3
盒子, 就双射映射到[S1, S2, S3]
中, 怎么映射都可以 只要满足是双射
方便起见, 直接映射: B1->S1, B2->S2, B3->S3
;
Si
, 就代表该盒子里的小球. (可能是数值相同小球
, 可能是集合不同小球
)
但你要保证, 这一套映射规则, 对所有的方案都生效; 不同的方案使用不同的映射规则, 这是不可以的
线性序列, 其实就对应所有的盒子情况
, 只是他可以写成线性
数组的方式
该序列的元素个数, 为盒子的个数; 因为每个元素为盒子, 所以不关注其里面的子元素的次序
即: 线性序列[ab, 空]
和 [ba, 空]
是同一个;
对于相同盒子
的线性化, 相较于上面的不同盒子
, 稍微有些不同
他的映射规则, 不能任意选择一个双射, 也不能所有方案都是使用同一个映射规则
而是: 所有方案使用同一个sort
规则, 不再关注映射规则 (sort规则与映射规则, 没有关系)
比如有3
个不同的盒子: B1, B2, B3
, 其线性序列为: [S1, S2, S3]
有一条和不同盒子
情况是一样的: Si
和Bi
是一样的!! 只是问题在于映射规则上
比如, 确定了Bi -> Sj
, 则: Bi
是什么, Sj
也是什么
如果是相同小球
则B1, B2, B3
代表一个自然数, 自然Si
也表示自然数
将B1, B2, B3
进行sort
排序后, 即为[S1, S2, S3]
此时, 两个线性序列相等, 等价于: 两个Si
的自然数相等
如果是不同小球
则B1, B2, B3
代表小球集合
(虽然小球都不同, 但B1, B2, B3
仍可能会有相同的, 因为盒子可能为空, 比如B1, B2
都是空集;)
此时, 仍需要对B1, B2, B3
进行sort
, 但这里的对集合的排序比较特殊
排序规则如下: (1. 空集最小) (2. 以集合中, 最小的小球为该集合的标识 最小的小球, 即下标最小的小球
)
比如, 盒子有: B1 = {a5, a2}
B2 = 空
B3 = {a6, a1}
(注意, B1={a5,a2}, 也可以写成{a2,a5}
)
其sort
后是: [ S1, S2, S3] = [ B2, B3, B1]
此时, 两个线性序列相等, 等价于: 两个Si
的集合相等
集合相等
: 两个集合形成双射.
多说一点, 虽然所有方案
都使用同一个sort
规则, 但与映射规则无关
比如一个方案的映射规则是: B1 -> S2
, 另一个方案的映射就可能是: B1 -> S3
以下的
线性序列
, 既适用于相同盒子
, 也适用于不同盒子
比如总方案数为n
个, 则对应有n
个线性序列
这n
个线性序列, 必须互不相同; 即, 方案 和 线性序列, 形成双射
因此, 定义两个线性序列的==
等于号规则, 至关重要. 规则如下:
此时, 又需定义: 两个线性序列的元素==
等于号规则, 规则如下:
线性序列的元素:
若是相同小球
, 则表示: 自然数.
此时, 等价于: 判定两个数值的相同
若是不同小球
, 则表示: 小球的集合
此时, 等价于: 判定两个集合的相同
集合相同
的充要条件: (1. 两个集合大小相同) (2. 两个集合形成双射)
比如: 集合A{a1, a2}
, 集合B{a2, a1}
, 这两个集合相同
小球与盒子模型
中, 本来盒子间是没有空间位置关系的!
通过线性化
, 使其变成线性序列
, 更加直观.
更加重要的是: 线性化之后, 因为是一个一维数组, 更容易计算所有的方案 (所有不同的序列, 即总方案数)
比如, 有2
个不同的小球a, b
, 放入2
个盒子A, B
, 每个盒子任意个
由上面分析可知:
若盒子是相同的, 方案有: 一个盒子里( a), 另一盒子( b)
, 一个盒子里( 0个), 另一盒子( ab)
, 共有2个方案
其线性序列为: [a, b]
[空, ba]
(写ba
和写ab
是一样的, 因为是集合)
若盒子是不同的, 方案有: A( a), B( b)
, A( b), B( a)
, A( 0个), B( ab)
,A( 2个), B( 0)
, 共有4个方案
其线性序列为: [a, b]
[b, a]
[空, ab]
[ba, 空]
(写ba
和写ab
是一样的, 因为是集合)
相同盒子
和 不同盒子`的性质与关联因为有了线性化
, 使得这个问题的研究要简单化.
**相同盒子
下的性质 (小球可以相同, 也可以不同): **
在整体全部线性序列All
集合中的某个线性序列A
为: [S1, S2, S3]
其全排列: [S1, S3, S2] [S2, S1, S3] ...
, 则:
该全排列, 均不是合法的
线性序列
因为, 合法的线性序列
, 必须经过sort
, 这些都不是sorted
的, 都不是All
集合里的
该全排列, 都可以等效于 同一个线性序列A
比如, 所有线性序列(不一定合法)有X
个, 则合法的序列有: X / (n!)
个 (n为盒子个数)
**不同盒子
下的性质 (小球可以相同, 也可以不同): **
在整体全部线性序列All
集合中的某个线性序列A
为: [S1, S2, S3]
其全排列: [S1, S3, S2] [S2, S1, S3] ...
, 则:
如果S1, S2, S3
互不相同, 则: 全排列每一个线性序列, 都对应一个方案
即, 由A
衍生的这个5
个全排列, 都是不同方案;
如果S1, S2, S3
中有相同的, 则: 需要对所有线性集合, 进行unique
去重操作
比如, [3, 2, 2]
, 其全排列3! = 6
个, 进行unique
后, 只有: [2, 2, 3]
[2, 3, 2]
[3, 2, 2]
这里需要借助一个公式
, 即: [a, a, b, b, b, c]
其全排列unique
后, 有多少呢?
对于其任意一个全排列
A来说: A = [x1, x2, x3, x4, x5, x6]
其中, 必然有2
个a, 3
个b, 1
个c, 令All = 6!
比如, a
的位置是: x2, x4
, 则你在A
的基础上, 交换x2, x4
就又得到一个新的全排列[x1, x4, x3, x2, x5, x6]
这个排列, 在x
角度 是不同的; 但是在a
元素的角度 是相同的, 即这两个排列, 是相同的
由于所有排列, 均包含2
个a;
故对任意一个排列, 都存在另外的1
个排列, 与其重复; All
必然是2
的倍数.
即, All /= 2
之后, 此时所有的全排列, 如果单看a
元素, 是没有重复的排列
再看b
, 比如他在A
中的位置是: x1, x3, x5
, 则你在A
的基础上, 任意的排列这3
个位置
x1, x5, x3
x3, x1, x5
…
可以得到: 3! - 1 = 5
个, 这5
个排列, 从单看b
元素的角度, 是完全一致的
由于所有排列, 均包含3
个b;
故对任意一个排列, 都存在另外的5
个排列, 与其重复; All
必然是6
的倍数.
即, All /= 6
之后, 此时所有的全排列, 如果单看b
元素, 是没有重复的排列
c
元素只有1个, 不存在重复的情况;
综上, All /= 2; All /= 6
后, 即为所有全排列进行unique
后的 排列数;
即, n
个元素, 其相同元素个数为: c1, c2, c3, .., cm
(c1 + c2 + ... + cm == n
)
则其unique
后的 排列数为: n! / c1! / c2! / ... / cm!
在同一个
小球与盒子模型
下, 研究其相同 和 不同
盒子的关联
由相同盒子
-> 不同盒子
对于相同盒子
下, 其某个线性序列A
为: [ S1, S2, S3, ..., Sn]
则其全排列n!
个, 在相同盒子
下, 均等效于 A
而这n!
个全排列, 在不同盒子
下, 假如其进行完unique
操作后的个数为y
个
则这y
个排列, 在不同盒子
下, 均为合法的
不同的线性序列
即: 相同盒子
下, 一个线性序列, 对应不同盒子
下的y
个线性序列!!
故: 在同一个小球与盒子模型
下, 不同盒子
的方案数 一定>=
相同盒子
的方案数.
由不同盒子
-> 相同盒子
对于不同盒子
下, 其某个线性序列A
为: [ S1, S2, S3, ..., Sn]
设A
进行sorted
后的序列为B
由于, A
的 unique
后的全排列 (x
个), 在不同盒子
下, 都属于不同的线性序列
而这x
个排列, 其sorted
后, 均为B
故, 也可以得到: 在同一个小球与盒子模型
下, 不同盒子
的方案数 一定>=
相同盒子
的方案数.
在小球与盒子模型
中, 如果小球是: 既有相同的小球, 又有不同的小球. 比如: [1, 1, 2, 2, 3]
且不同小球间, 没有影响.
不同小球间, 有影响.
比如: 排列数 A a b 排列数A_a^b 排列数Aab来看, 他是b
个不同小球, 但这b
小球 不能拆分开, 他们是相互影响的!
因为, 比如一个小球已经在 第i
号盒子里了, 那么另一个小球 就不能放到 第i
号盒子里!
假如你把这b
个不同小球给拆分开, 就会出现: 一个盒子里, 有多个小球, 所以不能拆分
不同小球间, 无影响.
比如, 我们允许不同小球
可以放到同一个盒子里; 那么不同小球间没有关联.
可以将这b
个不同小球, 给拆分成单个, 单独处理, 最后乘法原理.
即对于某个小球和盒子模型 Mode
, 小球是: [1, 1, 2, 2, 3]
(1, 1
是相同小球, 1, 2
是不同小球)
假如, 不同小球间, 可以放到同一个盒子, 即相互无影响
则, 原问题 = (小球为1 1
在该Mode
下的方案) * (小球为2 2
在该Mode
下的方案) * …
例题
https://www.acwing.com/file_system/file/content/whole/index/content/6061250/