一种列出所有可能组合的算法

来源:互联网 发布:销售部数据流程图 编辑:程序博客网 时间:2024/05/12 18:20

题目:现有n个小组,每个小组的人数分别是c1、c2、...、cn

现要求从每个小组中取一个人,共取n个人,组成一个领导小组。请设计一种算法,将所有可能的组合列出。

思路:可能的组合数量很容易求出,是c1*c2*...*cn连乘。但如何设计出算法呢?

首先,很显然这道题的算法必然是迭代或递归。如果用迭代实现的话,必须借助游标和栈。我们用递归的方式去求解算法:

如果我们去掉第一组,由第2组到n组每组跳出一个人组成领导小组,把这个小组的所有可能组合列出一张表,我们打印c1张这个表(也就是第一组成员数量),在第一张的所有组合前面都缀上第一组第一各成员的名字,第二张缀第一组第二个成员的名字,以此类推。那么第一组到第二组的可能组合也就都列出来了。

那么第2组到第n组的组合怎么列出来呢?对于第二组来说,只要求出第3组到第n组的组合,再用刚才的方法缀上组员的名字就可以列出了。

那么依次类推,3-n组,4-n组,…,n-1组到n组的组合都可以这样得出。最后,只需求第n组的组合。那么第n组的组合就简单了,就是所有组员的名字。然后把该组合列表交给第n-1组,n-1组即可得出n-1组到n组的所有可能组合,再交给n-2组。。。依次类推。

那么时间复杂度是多少呢?

对于最后一组,只需要写出所有组员的名字,一共是cn名组员,共写cn次。然后n-1组有cn-1名队员,每个组员的名字都要抄在所有组合前一次。一共要写cn* cn-1次,依次类推,时间复杂度是o(n)= cn+cn*cn-1+cn*cn-1*cn-2+…+ cn*cn-1*cn-2*…* c1.

0 0
原创粉丝点击