题目是这样的:有一个数组里面有10个b,然后现在有5个a,把a插入b里面,最后有多少种排列,并把排列打印出来????想了好久,
思路:5个'a'和10个'b'不管怎么排列, 最后肯定落在如下的15个槽中:
123456789101112131415
虽然a和b有多个不唯一, 但槽具有唯一性, 与上面编号一 一对应.
所以, 问题可转换成:
从上面15个槽中选择5个槽用来放入'a'。这样能保证取出来的排列组合既互不相同又包含所有情形。
根据排列组合原理结果应为:
C 5(上标)15(下标) = (15 * 14 * 13 * 12 * 11) / (5 * 4 * 3 * 2 * 1) = 3003
编程:采用迭代思想,编写程序实现数学中的排列组合算法C m(上标)n(下标)
void sort(int nPos, int m, int n);
int nPos; //数组游标,标识当前正在处理的数组
int m; //m值,这里是5
int n; //n值,这里是10
数据结构:
const int list = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; //槽的编号
过程:
主程序调用:
sort(0, m, n); 对list[]从0位置开始的数组(整个数组)打印排列组合 C m(上标)n(下标)的所有情况
从0位置开始处理,分两种情况:
1. 取0位置元素: 则后续需要从 (n-1)个元素中取出 (m-1)个元素,即:
sort(1, m-1, n-1);
2. 不取0位置元素:则后续需要从 (n-1)个元素中取出 (m)个元素,即:
sort(1, m, n-1);
sort函数不断迭代,且 m-1, n-1,不断收缩,当m,n趋于0时,迭代终止回溯。
代码:
能详细描述一下这个问题吗?
如果不明白 QQ联系我425947506
页:
[1]