如何得到有重复元素的不重复全排列
来源:互联网 发布:java mongodb3 连接池 编辑:程序博客网 时间:2024/04/29 20:08
M个元素中含有相同的元素,如何得到他们的全排列(不重复排列)?
元素表述: 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[N]={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; //退回来后要清除本结点所记录下标的使用记录 } } } }
- 如何得到有重复元素的不重复全排列
- 有重复元素的全排列
- 有重复元素的全排列
- 有重复元素的全排列问题
- 有重复元素的全排列问题
- 有重复元素的全排列问题
- 有重复元素的全排列
- 有重复元素的全排列问题
- 全排列(允许有重复元素)
- 【基础算法】有重复元素的全排列问题
- 重复元素全排列
- 全排列的简单递归方法(有重复元素和无重复元素的递归算法)
- 有重复全排列
- 全排列不重复
- 含重复元素的全排列
- 含重复元素序列的全排列
- 含有重复元素的全排列
- 含重复元素的全排列
- android 捕获运行时异常和运行时错误
- 全排列
- 在WPF中创建可换肤的用户界面
- QAD事务类型对照表
- epoll ET模式和LT模式
- 如何得到有重复元素的不重复全排列
- java单例模式
- Android系统移植(三)-按键字符表
- Job的任务执行流程之Map阶段
- EhCache 缓存
- 浅析C/C++内存泄漏的解决办法
- 什么是伪装对象(mock object)
- LCD驱动实例(一)
- Tomcat启动报错:IOException while loading persisted sessions: java.io.EOFException