在有些问题解决的时候可能需要用到排列或组合的,
应用到它的题目有见到,就是不知道排列与组合有没有独立出过题?
先描述描述,了解或者更了解的话 可以补充,或者跳过:- 排列举例,现在有abc 三个字符,3位排列的结果是:
- abc
- acb
- bac
- bca
- cab
- cba
- 排列的个数为 3*2*1=6 个 这个式子我是这么理解的:
- 第一位可选3个字符,现有三个开头,
- 第二位可选剩下的2个字符,3分别*2=6
- 第三位可以剩下1个字符选,所以共有6*1=6个结果。
- 从逐位选择字符的思路来做,我选择了递归调用。上次也看过别人说插入法做的,当时没理解代码。
-
- 应用举例: 比如你给定一个带有 减 或者 除的运算式子(除或者减,数字调换一下结果就不同的嘛),
- 以及给定参与运算的那些数,
- 可以用排列找出运算结果为N时,数字的排列方式。 比如算24点,就可以用到。
- (不过我见过最简洁的算24点是直接递归深入运算,当时理解了很久,其实也是隐含了排列的。
- 想批处理算24点的话,必须模拟一下分数,因为计算中可能一些分数被取整,结果就不精确。
- 事实上原分数乘某数=24)
-
- 密码: 如果知道密码个数和密码元素范围,个数不多的话,可以排列元素并尝试攻破密码
- (但现在都限制错误输入次数了呢)
复制代码
- 组合举例:
- 给定一个数组{1,2,3,4},列出所有子组合(包括{1,2,3,4},元素调换并不能算另一个组合,如:{2,1,3,4} ):
- 1
- 1 2
- 1 2 3
- 1 2 3 4
- 1 2 4
- 1 3
- 1 3 4
- 1 4
- 2
- 2 3
- 2 3 4
- 2 4
- 3
- 3 4
- 4
- n个数的组合的个数应该=(2的n次方)-1
- 在高中必修中对该个数的解释有两种, 为了方便我说运算比较直接的那种(上面那个2^n-1的):
- 四个数供选择,也就存在4个位{【1】,【2】,【3】,【4】}
- 而组合本身的性质就是: 列出各位的数在或者不在时造成的各种不同子组合,
- 就像概率计算,
- 第一位有两种情况,2
- 在第一位固定的情况下,第二位有两种情况,前2位就有2*2种情况,
- 依次类推,共4位,得到 2的4次方,而全部位为空的时候,没有组合,排除它,-1。
- (就是讲给没了解到的人的,这个概率计算类似: 给N个位,用0或者1表示,算出能产生多少个不同的数字,
- 人家000...也算进了,想像一下就挺直观的~)
-
- 应用举例: 可以用来找出 一组数字中,"和" 或者 "积" 为指定结果的那些组合
- 比如:1至9中, 和为15 的组合有
- 1+2+3+4+5
- 1+2+3+9
- 1+2+4+8
- 1+2+5+7
- 1+3+4+7
- 1+3+5+6
- 1+5+9
- 1+6+8
- 2+3+4+6
- 2+4+9
- 2+5+8
- 2+6+7
- 3+4+8
- 3+5+7
- 4+5+6
- 6+9
- 7+8
复制代码 哈上面不知道算不算交代清楚了,话说网上资料更全,
希望上面没有误导人的地方,如果有,还请知情人士及时告知。
题目是:
1. 排列"abcde" 这5个字符(排满5位)。
2. 找出{1,2,3,4,5,6,7,8} 中,和为30的那些数。
2月24日早上,考虑到指定个数的话,该题目可以用for- n 层 来解决,而我本意
是希望未接触递归的人可以初步用递归解题,以此了解一种解题技能。
当然对于未知元素个数时的排列组合,欢迎各种解法~
现题目升级一下-
- 1-2. 排列用户输入的字符(9个以内不重复)
- 2-2. 对用户输入的n个不同的数字进行组合,找出其中和为30的数字。没有则提示未找到结果。
- 为了方便处理,用户输入字符的格式由程序决定。
-
复制代码 已经很熟悉的话,难度可以增加的( 做有好东东的人要分享下哦)~
[ 本帖最后由 523066680 于 2010-3-1 09:06 编辑 ] |