一道组合数学问题求救

streetkid 2001-07-18 09:49:15
1,2,3,4,5,6的排列,要求6在5前,4在2前,2在1前,2在3前,请问有多少种不同的排列方法?我的答案是30,但书中给的答案却不是,请给出过程,给分多多。
...全文
159 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
这个很简单吗,用容斥定理自己计算一下就可以了。初中生的题目~~

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧