计数问题

计数问题是在离散数学以及算法设计中非常容易碰到的一类问题。

计数问题都可以归结成从集合中取元素的问题。
难点主要是
1.每次取完一个元素后,是否会使集合发生变化(例如集合元素减少),此时之后再次取元素就会受到影响,如果不考虑清楚这点很容易出错。
有些问题是从不同的集合中取元素,有些问题是从单个集合中取元素(此时基本上都会使集合发生改变)
2.如何把一个现实问题考虑成从一个集合中取元素的计数问题?

乘积法则

乘积法则主要应用于多次从集合中取元素的问题。

这里写图片描述
这个例子非常好转换,集合就是所有的办公室,而每次从中取一个办公室,取两次,但是每次取完后集合元素会变少,所以一共是12*11种办法


这里写图片描述
这个问题需要看成从1,0的集合中取一个数,每次取完后对集合本身无影响,取7次,所以一共是2^7=128种


这里写图片描述
此类问题可以转换为对集合的每个数,他都可能出现或不出现,所以等于从一个{出现,不出现}的集合中选一个,因为对于集合中的每个数都要选择,所以任意集合的子集数为2^n,n为集合的元素

求和法则

求和法则和乘积法则的区别是,求和法则只有一次选择,但选择对象可能是多个集合的并集。
这里写图片描述


对于用自然语言表示的问题,需要仔细辨认,不然很容易推断错误
这里写图片描述
该问题等于从两个集合的并集中选择一次,所以是83+37种选择

例子

这些法则虽然看上去简单,定义也非常清晰,但是如何套用到现实问题上,则是一大难点,如果理解稍有偏差,就很容易会掉进沟里
一般的现实问题都是多种求和法则的嵌套运用(就和函数组合一样)
这里写图片描述
该例子比较简单,还是考虑上面的两个难点,如何对现实问题建模和考虑每次取元素对之后操作的影响。
解法1:分成两种情况考虑 单字符和双字符
单字符直接从26个元素集合中取一次,26次
双字符从26个元素集合取一次,36个元素集合取一次,因为第一次取没有对后面有影响,所以是26*36
所以结果是26+26*36-5
解法2:将字符为空也放入第二个集合的元素集,注意第一个字符不能为空
所以是26*37-5


这里写图片描述
可以容易看出,该结果由三部分相加。
三部分的计算都类似,不过要注意一个问题,例如6个字符构成的密码,和之前的选办公室问题有很大区别。密码是有序的序列,而选两个办公室是任意顺序的。即有序对(办公室1,办公室2)和(办公室2,办公室1)等价
所以类似密码这种有序的东西,不能直接从六个集合中选。因为例如(数字1,数字2),(数字2,数字1)不等价。
可以用数据结构类比,如果要选出的集合是一个set,即无关顺序的,例如选两个办公室。如果要选出的集合是一个list,例如密码序列,则和选择顺序有关。
如果算10*36^5次,就错了,因为数字可以出现在任意位置。
所以这里用减法原则比较方便
这里写图片描述


欢迎关注我的github
https://github.com/luckyCatMiao

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值