一种列出所有可能组合的算法
来源:互联网 发布:销售部数据流程图 编辑:程序博客网 时间: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
- 一种列出所有可能组合的算法
- 输入一串不重复的字符串,列出所有可能的组合(java实现)
- 微软100题21题(要求将其中所有的可能组合列出来)
- 从1..n中间选取任意组合,其和为m,列出所有组合的算法。
- 获取所有可能的组合
- 由a-z、0-9组成的3位密码,列出并打印所有可能的密码组合
- 列出所有组合排序
- 列出字符串所有组合
- 打印所有字母所有可能的组合
- C# 计算排列组合数,及列出所有组合形式的算法
- 打印出所有可能的括号组合
- 字符串的所有可能组合输出
- 30.查找所有可能的字符串组合
- 46.排列的所有可能组合
- 递归-列出一个list中的所有的组合
- 数据结构--栈-编写一个算法输出n个布尔量的所有可能的组合
- 21 整数n和m,随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 打印所有小写字母所有可能的组合
- 使用OGG的logdump工具检查OGG trail file中存在不存在相关表的记录
- OpenCV学习笔记:如何训练级联分类器
- HDU-1548 A strange lift(最短路[Spfa || BFS])
- 关于ListView的Adapter在调用notifyDataSetChanged()方法无效的原因
- 文档对象模型DOM1
- 一种列出所有可能组合的算法
- 如何在一家大公司里受到重用
- 面向设计的半封装web组件开发(概要版)
- Swift爬行篇-- UIButton
- iOS 获取wifi ssid 名称
- Android开发入门之“活动的生命周期”
- 黑马程序员———正则表达式及其其他类
- OpenCV训练分类器制作xml文档
- TCP/IP详解学习笔记