这次复习的是计数问题,立刻走起吧!
1.乘法原理
如果一项工作需要t步完成的,第一步有n1种不同的选择,第二步有n2种不同的选择,……,第t步有nt中不同的选择,那么完成这项工作所有可能的选择种数为:
n1 x n2 x …… x nt
def multiply(*args): count = 0 for x in args: count *= x print "the all possible choices is %d" % count
2.加法原理
假定X1,X2,……,Xt均为集合,第i个集合Xi有ni个元素,则可以从X1,X2,……,Xt中选出的元素总数为:
n1 + n2 + …… + nt
def add(*args): count = 0 for x in args: count += x print "the total number is %d" % count
3.排列问题
从含n个不同元素的集合S总有序选取的r个元素叫做S的一个r排列,不同的排列总数记为P(n, r),如果r = n,则称这个排列为S的一个全排列,简称为S的排列。
下面是在对集合中进行排列,添加了几个方法:
def remove(self, element): self.s.remove(element) self.__num -= 1 def copy(self): setTemp = MySet() for x in self.s: setTemp.add(x) return setTemp def rank(self, n): if n <= self.__num and n > 0: setTemp = MySet() self.rankHelp(setTemp, n, '', self) return setTemp else: print 'Error in parameter' def rankHelp(self, setTemp, n, element, s1): if n == 1: for x in s1.s: e = element e += x setTemp.add(e) else: for x in s1.s: temp = s1.copy() e = element e += x temp.remove(x) self.rankHelp(setTemp, n-1, e, temp)
4.组合问题
从含有n个不同元素的集合S中无序选取的r个元素叫做S的一个r组合,不同的组合数记为C(n, r)。
def build(self, temp): setTemp = MySet() for x in temp: setTemp.add(x) return setTemp def group(self, n): if n <= self.__num and n > 0: setTemp = MySet() self.groupHelp(setTemp, n, '', self) return setTemp else: print 'Error in parameter' def groupHelp(self, setTemp, n, element, s1): if n == 1: for x in s1.s: e = element e += x setTemp.add(e) elif n == s1.__num: for x in s1.s: element += x setTemp.add(element) else: for x in range(s1.length()-n+1): e = element e += s1.get(x) temp = self.build(s1.s[x+1:]) self.groupHelp(setTemp, n-1, e, temp)
5.容斥原理
所谓的容斥,是指我们计算某类物体的数目的时候,要排斥那些不应包含在这个计数中的数目,但同时要包容那些被错误地排斥了的数目,以此补偿,这个原理称为容斥原理。
6.鸽笼原理
若有n+1只鸽子住进n个鸽笼,则有一个鸽笼至少住进2只鸽子。