• 全部
  • 问答

一道组合数学问题求救

streetkid 2001-07-18 09:49:15
1,2,3,4,5,6的排列,要求6在5前,4在2前,2在1前,2在3前,请问有多少种不同的排列方法?我的答案是30,但书中给的答案却不是,请给出过程,给分多多。
...全文
122 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhou_hua_0911 2001-08-12
6!*0.5*0.5*0.5*0.5=6*5*4*3*2*1*0.25*0.25=45
因为,共有6!种排法,6在5前面有0.5的概率,同理4在2的前面的概率同为0.5,而2在1的前面的概率亦为0.5,2在3前的概率也为0.5
回复
yug 2001-07-21
to woodqiang(木头):
1. loca[i]表示数字i的排列位置,所以loca[6]<loca[5]即表示6这个数字在5这个数字前面出现;
2. 同样,loca[i]表示数字i的排列位置,请仔细理解,这里不存在数字重复的问题,mark[7]的作用是避免不同分得数字占据同一位置。

不明白为什么有那么多的答案,我觉得从排列组合和程序两方面都讲得很清楚了,不明白...
只好给出所有排列了:
4,2,1,3,6,5,
4,2,1,6,3,5,
4,2,1,6,5,3,
4,2,3,1,6,5,
4,2,6,1,3,5,
4,2,6,1,5,3,
4,6,2,1,3,5,
6,4,2,1,3,5,
4,6,2,1,5,3,
6,4,2,1,5,3,
4,2,3,6,1,5,
4,2,6,3,1,5,
4,2,6,5,1,3,
4,6,2,3,1,5,
6,4,2,3,1,5,
4,6,2,5,1,3,
6,4,2,5,1,3,
4,6,5,2,1,3,
6,4,5,2,1,3,
6,5,4,2,1,3,
4,2,3,6,5,1,
4,2,6,3,5,1,
4,2,6,5,3,1,
4,6,2,3,5,1,
6,4,2,3,5,1,
4,6,2,5,3,1,
6,4,2,5,3,1,
4,6,5,2,3,1,
6,4,5,2,3,1,
6,5,4,2,3,1,

不会再有问题了吧!
回复
woodqiang 2001-07-21
上面那位yug(寒鹤) 老兄的程序是否有点问题?
我觉得判断语句里的条件只能保证(第六位上的数字<第五位上的数字)但题目要求是6这个数字在5这个数字前面出现。还在排列好像要求数字不可以重复的,你没有这个控制。
回复
zhangning111 2001-07-21
我算怎么是 45,有跟我一样的没有。
回复
china_bills 2001-07-21
肯定是有24种排法,你们都错了
回复
china_bills 2001-07-21
肯定是有24种排法
回复
china_bills 2001-07-21
应该是有24种排法,如果我的答案对了,我再告诉你算法
回复
woodqiang 2001-07-21
to yug(寒鹤)
sorry是我错。我理解错了loca数组的用法。
回复
SoftWare1999 2001-07-21
不用怀疑了就是30种!
yug(寒鹤) 和lins(寒夜听箫) 都已经解释清楚了,结束吧!
回复
林仪明 2001-07-21
答案是30种!yug(寒鹤) 先生是对的!
根据题目可以确定1234的排法只有两种4213或4231,以及56的情况。
把56插入4213或4231中是15*2=30种。
yug(寒鹤)先生已经用程序写出了,我就不废话了!
回复
fish_autumn 2001-07-20
答案30,先按4,2排列,
1,3在2后有两种排法,
4个数6有5个位置可选,
6在最左端,5有5个位置可选,
6在4后,5有四个位置可选,
……
6在四个数最右端,5有一个位置可选
所以结果2×(5+4+3+2+1)=30
回复
monthbird 2001-07-18
C(6, 2)*C(2, 1)=30
回复
yug 2001-07-18
答案就是30
先考虑6在5前的排列,显然,为6!/2.
当6和5的位置确定,则排列数为4!,考虑剩下的4个数的排列,满足条件的排列仅为2。
所以,答案为(6!/2)*(2/4!)=30
书上也有错的时候。

顺便编个程序验证一下:

int loca[7]; /* loca[1]-loca[6]标记数字 1-6 的排列位置*/
int mark[7]; /* mark[i](i=1,2...,6)标记位置i被占据*/

int sum=0;
int set(int next)
{
int i,j;
for(i=1;i<=6;i++)
{
if(mark[i]==0)
{
loca[next]=i;
mark[i]=1;
if(next==6)
{
if(loca[6]<loca[5] && loca[4]<loca[2] && loca[2]<loca[1] && loca[2]<loca[3])
{
sum++;
printf("\n");
for(j=1;j<=6;j++)printf("%d->%d,",j,loca[j]);
}
}
else set(next+1);
mark[i]=0;
}
}
}

main(){
int i;
for(i=1;i<=6;i++)mark[i]=0;
set(1);
printf("\nsum=%d",sum);
getch();
}
回复
huangry 2001-07-18
一共是180种,6!/2/2/2/2=180
回复
anjun 2001-07-18
不对,是小学五年级题目~~~~
回复
starfish 2001-07-18
这个很简单吗,用容斥定理自己计算一下就可以了。初中生的题目~~
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2001-07-18 09:49
社区公告
暂无公告