CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

如何用程序实现排列组合?

楼主rsh(rsh)2001-01-25 23:00:00 在 专题开发/技术/项目 / 数据结构与算法 提问

如何用程序实现排列组合?如:从一组数字1,2,3,4,...中抽出n(n=1,2,3,..)个不同的数,列出所有的组合. 问题点数:20、回复次数:8Top

1 楼xzjxu(糊涂神仙)回复于 2001-01-26 02:11:00 得分 0

穷举Top

2 楼baitianshi1981(oоО北天石)回复于 2001-01-26 10:29:00 得分 0

递归应该是最简单的解决方法Top

3 楼baitianshi1981(oоО北天石)回复于 2001-01-26 10:41:00 得分 0

递归应该是最简单的解决方法。Top

4 楼hyqryq(不知道叫什么好)回复于 2001-01-26 11:36:00 得分 0

基本办法是回朔。  
  用递推实现。Top

5 楼baitianshi1981(oоО北天石)回复于 2001-01-26 11:45:00 得分 0

对了,你还记得归纳法证明吧,呵呵。Top

6 楼rsh(rsh)回复于 2001-01-28 00:53:00 得分 0

有没有具体的程序?Top

7 楼zhangning111(比傻子还笨)回复于 2001-01-28 18:36:00 得分 20

                                            从N个数中任取M个数的组合(M<=N)  
  为方便起见,我们把它记为c(N,M)。  
  容易想到,  
  c(N,1)    
  for(i=1;i<=N;i++)cout<<i<<endl;  
   
  c(N,2)  
  for(i=1;i<=N-1;i++)  
          for(j=i+1;j<=N;j++)  
          cout<<i<<"-"<<j<<endl;  
  c(N,2)可以理解为。组合包含1                       再加上2~N个数中任取一个数  
                                      组合不包含1包含2         再加上3~N个数中任取一个数  
      组合不包含1,2包含3   再加上4~N个数中任取一个数  
      依此类推。  
   
  c(N,3)  
  for(i=1;i<=N-2:i++)  
          for(j=i+1;j<=N-1;j++)  
          for(k=j+1;k<=N;k++)  
          cout<<i<<"-"<<j<<"-"<<k<<endl;  
  c(N,3)可以理解为。组合包含1                       再加上2~N个数中任取两个数  
                                      组合不包含1包含2         再加上3~N个数中任取两个数  
      组合不包含1,2包含3   再加上4~N个数中任取两个数  
      依此类推。  
   
  由此可归纳出c(N,M)  
   
  用num[1..M]存储M个数  
    num[s]  
            1         num[1]=i=1       to   N-M+1  
    2         num[2]=j=i+1   to   N-M+2  
    3         num[3]=k=j+1   to   N-M+3  
    .  
    .         num[s]=num[s-1]+1   to   N-M+s  
    M  
  得,当s=1     num[1]=1                     to   N-M+s  
        当s>1     num[2]=num[s-1]+1   to   N-M+s  
   
  #include   <iostream.h>  
  #include   <conio.h>  
   
  void   main(void)  
  {  
  const   int   N=7,M=3;//从N个数中任取M个数的组合(M<N  
  int num[M+1],s,i;  
   
  num[1]=0;s=1;  
  while(s!=0)  
  {  
  if(s!=M)//取小于M个数  
  {  
  num[s]++;  
   
  if(num[s]>N-M+s)  
  s--;//回朔  
  else  
  {  
  s++;  
  num[s]=num[s-1];  
  }  
  }  
  else//取第M个数  
  {  
  num[s]++;  
   
  for(i=1;i<M;i++)cout<<num[i]<<"-";//输出  
  cout<<num[M];  
  cout<<endl;  
   
  if(num[s]==N-M+s)s--;//回朔  
  }  
  }  
  getch();  
  }  
   
  Top

8 楼rsh(rsh)回复于 2001-01-29 21:58:00 得分 0

thank   you!Top

相关问题

  • 请各位高手进来讨论一下这个排列组合问题的最高效率程序实现方法。
  • 高分求这个排列组合问题的程序代码!!
  • 排列组合?
  • 求如下组合的遍列问题之程序实现
  • 求如下组合的遍列问题之程序实现
  • 排列组合问
  • 排列组合题
  • 一简单问题:怎样用递归实现组合(不是排列)问题?
  • 求一个 Delphi算法:实现 N 位数(N<10)的任意排列组合
  • 只组合不排列

关键词

  • 组合
  • 排列
  • 个数
  • 程序实现排列组合
  • 中任取
  • num
  • include

得分解答快速导航

  • 帖主:rsh
  • zhangning111

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo