如何得到有重复元素的不重复全排列
2012-03-23 16:42
176 查看
M个元素中含有相同的元素,如何得到他们的全排列(不重复排列)?
元素表述: a1,a1,...a1, a2,a2,...a2,.......,an,an,...an
其中,a1的个数为N1, a2的个数为N2,以此类推,总个数为M。
则可以证明不重复的排列种类的数目: M!/(N1!*N2!*...*Nn!)
就是将N个数字做全排列。不过对于某些数字不能选择而已。
这里只要限制将要选择的数字必须大于原来已经选择的数字就可以达到目标。
下面是递归算法
元素表述: a1,a1,...a1, a2,a2,...a2,.......,an,an,...an
其中,a1的个数为N1, a2的个数为N2,以此类推,总个数为M。
则可以证明不重复的排列种类的数目: M!/(N1!*N2!*...*Nn!)
就是将N个数字做全排列。不过对于某些数字不能选择而已。
这里只要限制将要选择的数字必须大于原来已经选择的数字就可以达到目标。
下面是递归算法
#include <stdio.h> #define N 5 void arrange(int rec[],int used[],int depth); void write(int rec[], int maxdepth); int a ={1,1,2,2,3}; //这些值必须升序排列且大于0 int count=0; int main() {int rec[N+1]={0},used[N+1]={0}; arrange(rec,used,0); printf( "\ncount=%d ",count); getchar(); return 0; } void write(int rec[]) { int i; for(i=0;i <N;i++) printf( "%4d ",a[rec[i]]); printf( "\n "); count++; } void arrange(int rec[],int used[],int depth) { int i,found_num; if (depth> =N) write(rec); //找到了一个可行解,输出 else {found_num=0; //增加这个变量记录原来本结点存储的数字 for(i=0;i <N;i++) // 搜索该结点的孩子结点 {//如果该下标在前面还没有使用过,且该下标所指示的数字比 //原先所放置的数字要大,则是一个部分解 if(used[i]==0 && a[i]> found_num ) { rec[depth]=i; //记录下该结点放置的下标 found_num=a[i]; //记录下本结点存放的数字 used[i]=1; // 标记该下标已经被使用 arrange(rec,used,depth+1); // 扩展,进入孩子结点继续搜索 used[i]=0; //退回来后要清除本结点所记录下标的使用记录 } } } }
相关文章推荐
- 用javascript如何删除一个数组中的重复元素
- UVA 11076 Add Again(有重复元素的全排列问题)
- C#实现如何判断一个数组中是否有重复的元素
- 给数组添加一个根据指定下标删除元素的方法、得到0-100的随机数不重复(js)、得到外联样式的css样式值
- leetcode-46. Permutations(非重复元素全排列)
- 一个有N个元素的集合,其中有相同元素。 需要得到按重复元素多少排序的新集合。
- jquery 得到了this,如何获得到this下的一个元素
- LintCode 15-全排列 16-带重复元素的全排列
- javascript如何判断数组内元素是否重复的方法集锦
- 减治求有重复元素的全排列
- java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
- HashSet中是如何判断元素是否重复的
- javascript如何判断数组内元素是否重复的方法集锦
- 如何去除数组中的重复元素?
- (原创)扩展方法:给 IEnumerable<T> 扩展一个得到重复元素的方法
- 如何判断一个整数数组中是否有重复元素
- 如何消除一个数组里面的重复元素?(面试题目)
- vector 如何得到最后一个元素
- 如何通过结构体中的任意一个元素的地址得到这个结构体的首地址(container_of)
- 【ZOJ】3841 Card (搜索+组合数学(重复元素的全排列)