精彩专题 |
如何做好项目沟通计划
软件项目质量管理
国际工程索赔与反索赔
|
更多:
|
|
联系社区管理员 |
咨询电话 010-82273401/11
斑竹申请 admin@mypm.net
版权所有 © 2003-2004
京ICP证070584号
BBS业务许可2007第353号
最佳显示模式:1024*768像素
|
|
 |
如何得到有重复元素的不重复全排列? [发表于 2006/10/9] 状态 开放帖 精华贴 浏览量 3891 |
|
M个元素中含有相同的元素,如何得到他们的全排列(不重复排列)? 元素表述: a1,a1,...a1, a2,a2,...a2,.......,an,an,...an 其中,a1的个数为N1, a2的个数为N2,以此类推,总个数为M。 则可以证明不重复的排列种类的数目: M!/(N1!*N2!*...*Nn!) 例如: 1,2,2,3,3 的全排列: 12233 12323 12332 13223 13232 13322 21233 21323 21332 22133 22313 22331 23123 23132 23213 23231 23312 23321 31223 31232 31322 32123 32132 32213 32231 32312 32321 33122 33212 33221 共有 5!/1!/2!/2!=30种。 寻求得到该排列的较优算法。即不从 M! 个排列中筛选不重复项。
|
-------------------------------------------------------------------------------------------------------- PMP认证,项目经理最佳选择! >>> 由论坛统一发布的广告:
|
|
楼主
domo

职务 无
军衔 上尉
来自 北京市
发帖 363篇
注册 2005/1/7
PM币 4082
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/9]
|
就是将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,2,2,3,3}; int count=0; int main() {int rec[N+1]={0},used[N+1]={0}; arrange(rec,used,1); printf("\ncount=%d",count); getchar(); return 0; } void write(int rec[]) { int i; for(i=1;i<=N;i++) printf("%4d",a[rec[i]]); printf("\n"); count++; } void arrange(int rec[],int used[],int depth) { int i; if (depth>N) write(rec); //找到了一个可行解,输出 else { for(i=0;i<N;i++) // 搜索该结点的孩子结点 {//如果该下标在前面还没有使用过,且该下标所指示的数字比 //原先所放置的数字要大,则是一个部分解 if(used[i]==0 && (i==0 || a[i]>a[rec[depth]]) ) { rec[depth]=i; //记录下该结点放置的下标 used[i]=1; // 标记该下标已经被使用 arrange(rec,used,depth+1); // 扩展,进入孩子结点继续搜索 used[i]=0; //退回来后要清除本结点所记录下标的使用记录 if (depth<N) rec[depth+1]=0; //要把孩子结点的使用记录清除 } } } }
|
|
|
1楼
cmag

职务 无
军衔 少校
来自 北京
发帖 291篇
注册 2006/9/8
PM币 3160
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/9]
|
楼上的算法有问题, 用的算法算 1, 1, 2, 3, 3 就不对了
|
-------------------------------------------------------------------------------------------------------- 我就是我
|
|
2楼
zfm12

职务 无
军衔 上校
来自 北京市
发帖 485篇
注册 2006/4/5
PM币 8651
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/9]
|
我这儿有一种方法, 不见得是最优的, 但能满足楼主"即不从 M! 个排列中筛选不重复项"的条件 那就是转化为组合问题: 例如: 对于以上的例子, a, b, b, c, c 一开始五个位置为空 对于a, 其可以在5个位置中造1个位置放入a, 其情况有5种, 对于上一步每种情况, 在剩下的4个位置选2个放入b, 则有6种, 共有5*6=30种 对于上一步每种情况, 在剩下的2个位置选2个放入b, 则有1种, 共有30*1=30种 按以上思路解决即可
|
|
|
3楼
XO

职务 无
军衔 少将
来自 上海
发帖 436篇
注册 2005/1/7
PM币 10955
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/9]
|
M个元素中含有相同的元素,如何得到他们的全排列(不重复排列)? 元素表述: a1,a1,...a1, a2,a2,...a2,.......,an,an,...an 其中,a1的个数为N1, a2的个数为N2,以此类推,总个数为M。 ------------------------------------------------------------- 如果老盛的方法不见得是最优的 我的这个办法可能就是很笨的了 供参考 1.取a1,自成一个满足条件的全排列 2.再取第二个放在最前面{a1,a1},第一个元素依次与后面的各元素交换(在交换之前判断是否元素相等,相等则不交换)与{a1,a1}构成一个满足条件的全排列 3.再取第3个,按照2的方式构造3个元素时满足条件的全排列 ……
|
|
|
4楼
杜娟

职务 无
军衔 上将
来自 河北省
发帖 1129篇
注册 2006/4/30
PM币 16060
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/9]
|
装错信封问题,组合数可以有递推公式计算,也有通项公式, 附件是我google到的相应文件,你可以看一下
|
-------------------------------------------------------------------------------------------------------- msn: chen39yi@hotmail.com blog: http://chenyi.blogsome.com Surely You're Joking, Mr. Feynman!
|
|
5楼
chen39yi

职务 无
军衔 中士
来自 福建
发帖 235篇
注册 2006/5/9
PM币 1647
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/20]
|
抽屉
|
-------------------------------------------------------------------------------------------------------- 我爱我自由,我欲我拼搏
|
|
6楼
acooling

职务 无
军衔 中尉
来自 辽宁省
发帖 434篇
注册 2004/8/15
PM币 2251
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/22]
|
lihai
|
|
|
7楼
whhm456

职务 无
军衔 三等兵
来自 山东
发帖 26篇
注册 2006/10/17
PM币 0
经验
|
|
Re:如何得到有重复元素的不重复全排列?
[回复于 2006/10/23]
|
项目管理师要用这样的算法那太牛X了.
|
|
|
8楼
renly2008

职务 无
军衔 中士
来自 北京
发帖 51篇
注册 2006/10/22
PM币 690
经验
|
|
|