可重复排列组合算法

wfcwscwfc 2008-03-22 04:43:18
如已经有0,1,2,3,4,e,a,s,d,f 10个字符!我想得到可重复排列组合及组合的数目!
如下显示:
0000000000
0000000001
.
.
.
000000000f
1000000000
.
.
.
ffffffffff

有n个
...全文
1101 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
XphteR 2008-06-13
  • 打赏
  • 举报
回复
可重复排列为RP(m,n) = m的n次幂,所有排列方案用baihacker的方法即可求出。
但可重复组合怎么求所有组合方案呢?请高手指点^_^
冰矿 2008-03-22
  • 打赏
  • 举报
回复
可重复10取10我算了算
是100!/(10!*10!*10!*10!*10!*10!*10!*10!*10!*10!)
数据太庞大了,你用文本存可能好些
wfcwscwfc 2008-03-22
  • 打赏
  • 举报
回复
谢谢!各位!
回贴的都有分!
冰矿 2008-03-22
  • 打赏
  • 举报
回复
10取10太大了,仅给4取3的结果,
AAA
AAB
AAC
AAD
ABA
ABB
ABC
ABD
ACA
ACB
ACC
ACD
ADA
ADB
ADC
ADD
BAA
BAB
BAC
BAD
BBA
BBB
BBC
BBD
BCA
BCB
BCC
BCD
BDA
BDB
BDC
BDD
CAA
CAB
CAC
CAD
CBA
CBB
CBC
CBD
CCA
CCB
CCC
CCD
CDA
CDB
CDC
CDD
DAA
DAB
DAC
DAD
DBA
DBB
DBC
DBD
DCA
DCB
DCC
DCD
DDA
DDB
DDC
DDD
请按任意键继续. . .
冰矿 2008-03-22
  • 打赏
  • 举报
回复
楼主,我又想了一种,是递归的,代码如下

void permutation(char s[], char u[], char o[], int n, int m, int p)
{
int i;
if ( p == m ) /*达到所选则的数目*/
{
for ( i = 0; i < m; i++ )
printf("%c",o[i]);
printf("\n");
}
else
{
for ( i = 0; i < n; i++ )
{
if ( u[i]!=m ) /*如当前元素为达到使用次数即m次*/
{
u[i] += 1; o[p] = s[i];
permutation(s,u,o,n,m,p+1);
u[i] -= 1;
}
}
}
}
int main()
{
char s[] = "ABCDE";/*原集合数据*/
char o[5]; /*用于输出的*/
char u[5] = {0}; /*用来标记当前元素所使用的次数*/
permutation(s,u,o,4,3,0);/*以4取3的排列为例*/

system("PAUSE");
return 0;
}
ryfdizuo 2008-03-22
  • 打赏
  • 举报
回复
你想要所有的情况,只能穷举了,
如2楼所说,10^10种,
wfcwscwfc 2008-03-22
  • 打赏
  • 举报
回复


void out(char* data, int len, char * buff, int curr)
{
if (curr == len)
{
buff[curr]=0;
printf(buff);
}
else
{
for (int i = 0; i < 10; ++i)
{
buff[curr] = data[i];
out(data, len, buff, curr+1);
}
}
}

这个算法能加一些注释吗?
还有你的out()在哪儿?

另两位的就不好说了!呵呵!

冰矿 2008-03-22
  • 打赏
  • 举报
回复
可以把集合的每个元素加倍,比如取10个字符的话,把原集合复制,每个集合元素个数变为原来的10倍,
然后再对增加后的集合取排列或组合就可以嘛
Supper_Jerry 2008-03-22
  • 打赏
  • 举报
回复
10^10个,遍历吧。写到文件里面。
baihacker 2008-03-22
  • 打赏
  • 举报
回复
char data[] = "你的数据";
char buff[11];

void out(char* data, int len, char * buff, int curr)
{
if (curr == len)
{
buff[curr]=0;
printf(buff);
}
else
{
for (int i = 0; i < 10; ++i)
{
buff[curr] = data[i];
out(data, len, buff, curr+1);
}
}
}

差不多是这...

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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