| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9763 人关注过本帖
标题:请教高手从m个数中任取n个数的组合算法(可以重复)
只看楼主 加入收藏
myelement
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-10
收藏
 问题点数:0 回复次数:29 
请教高手从m个数中任取n个数的组合算法(可以重复)
我想问问有m个数,如果任意输入n,可以实现m中取n的组合算法,数字可以允许重复。比如有3个数1,2,3,n=3,则一共有111,112,113,221,222,223,331,332,333,123种取法(123,321,231中确只能有1个)。即需要满足公式,C(m,n)=(m+n-1)!/n!(m-1)!,有哪位高手能帮帮忙?想了很久都不得其解,谢谢先!
搜索更多相关主题的帖子: 算法 
2008-06-10 09:46
myelement
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-10
收藏
得分:0 
有没有哪位高手大虾知道啊,想了两个星期了,编的程序只能取出无重复的。谢谢先!!!
2008-06-10 23:02
C王之王
Rank: 1
来 自:南京
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-6-5
收藏
得分:0 
别说你 我都想了3天了 想不出
2008-06-10 23:09
myelement
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-10
收藏
得分:0 
我现在编的程序可以取出不同数的类似1234,1356和完全重复的1111,2222,最难的就是如何实现有部分重复的比如1122,1113,1145之类的。
2008-06-11 00:05
泉此方
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2008-6-10
收藏
得分:0 
不难,直接DFS
不过楼主,我想看看你写的代码

" border="0" />[color=white]

#ifdef _LOLICON_
#include"Loli"  //http://
#endif
2008-06-11 00:15
biluo0120
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-6-11
收藏
得分:0 
重复的取数字,c(m,n)不是m的n次方么?
楼主 确定 你给的 算法没错?
2008-06-11 00:46
myelement
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-10
收藏
得分:0 
先谢谢楼上诸位的先!
重复取数字是指每一种取法中数字可以有重复,比如说112,111可以,不过112和121,211却只能出现一次。
我当时只想要结果,不在乎算法,所以我自己编时用的是最笨的方法,一个一个实现。
先是编数字完全没有一样的,象123,234这样的,我用的算法
int a[2000];
int a[1]=1;km=1;
while(n-a[1]>=m)  
    {while(km<m)      
      {km++;  
        a[km]=a[km-1]+1;  
      }  
      for(;a[km]<=n;a[km]++)      
      {kinds++;  
        for(i=1;i<=m;i++)  
            printf("%5d",a[i]);  
        printf("\n");  
      }  
      km--;  
      while(n-a[km]<=m-km)km--;     
    }  
    for(i=n-m+1;i<=n;i++)  
        printf("%5d",i);   
然后编数字完全一样的,这个很容易,把每一个数取n次就可以了,不过最难的就是数字部分有重复的。
另我不是太懂DSF, 是一种数据结构吗?我是学化学的,老板非要我找出20种氨基酸可以组合成哪些种蛋白质,所以还要各位多多指教!
2008-06-11 07:30
泉此方
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2008-6-10
收藏
得分:0 
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
#include <iostream>
using namespace std;
template<class T>
int DFS_FindNext(T arr[], int nMaxElm, int nDepth)
{
   
int n = nDepth-1;
    for (++arr[n]; n>=0 && arr[n]>=nMaxElm; ++arr[--n]);
    if (n<0) return 0;
    for (int t = n+1; t<nDepth; ++t) arr[t] = arr[n];
    return 1;
};
int main()
{
   
int n,m;
    while(scanf("%d%d",&m,&n)==2)
    {
        
int arr[20]={0}, outmap[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        do
        
{
            
for(int t=0; t<n; ++t)
            {
               
printf(" %d", outmap[arr[t]]);
            }
            
putchar('\n');
        }while(DFS_FindNext(arr, m, n));
    }
   
return 0;
}

是DFS,我想说写这个的确很容易,还有,我只准备了m在15以内,如果你要更大的你就自己加上吧


" border="0" />[color=white]

[[it] 本帖最后由 泉此方 于 2008-6-11 12:58 编辑 [/it]]

#ifdef _LOLICON_
#include"Loli"  //http://
#endif
2008-06-11 12:50
泉此方
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2008-6-10
收藏
得分:0 
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
template<class T>
int DFS_FindNext(T arr[], int nMaxElm, int nDepth)
{
   
int n = nDepth-1, c = nMaxElm-nDepth;
    for (++arr[n]; n>=0 && arr[n]>c+n; ++arr[--n]);
    if (n<0) return 0;
    for (int t = n+1; t<nDepth; ++t) arr[t] = arr[t-1],++arr[t];
    return 1;
};
int main()
{
   
int n,m;
    while(scanf("%d%d",&m,&n)==2)
    {
        
int arr[30], outmap[30];
        {for(int t=0;t<m;++t)arr[t]=t,outmap[t]=t+1;}
        
do
        
{
            
for(int t=0; t<n; ++t)
            {
               
printf(" %d", outmap[arr[t]]);
            }
            
putchar('\n');
        }while(DFS_FindNext(arr, m, n));
    }
   
return 0;
}


这是无重复的,前面的是可重复的


" border="0" />[color=white]

#ifdef _LOLICON_
#include"Loli"  //http://
#endif
2008-06-11 13:17
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我最喜欢燕子的代码了。。。

学习需要安静。。海盗要重新来过。。
2008-06-11 13:18
快速回复:请教高手从m个数中任取n个数的组合算法(可以重复)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033010 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved