有关排列组合的算法问题,请指教!

common_man 2003-05-08 03:43:17
我的程序要实现这样的功能:
有一个有N个结点的链表,每次从中复制m(m<N)个不同的结点,组成一个新的小链表,直到取出所有组合为止,比如说,对于有4个结点的链表,每次取两个结点,则要生成6个长度为2的小链表。
这个算法该怎么构思,请哪位大侠给一点指点,多谢了!
...全文
42 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
common_man 2003-05-10
  • 打赏
  • 举报
回复
多谢各位了!
regainworld 2003-05-09
  • 打赏
  • 举报
回复
上面没写完。。。
...

if (m==n)
{//mhead+nl为要求链表
while (p != ml)
{
printf("%d ", p->num);
p=p->next;
}
printf("%d ", ml->num);
while (nl)
{
printf("%d ", nl->num);
nl=nl->next;
}
printf("\n");
return;
}

//c(m-1,n-1)
p=new list;
p->num=nl->num;
p->next=null;
ml->next=p;
GetMList(p, nl->next, m-1, n-1);

//c(m, n-1)
GetMList(ml,nl->next, m, n-1);
}

我也不知道对不对,不过思路应该差不多!
regainworld 2003-05-09
  • 打赏
  • 举报
回复
这题应该用递归解啊!
c(m,n)=c(m-1,n-1)+c(m,n-1) m<n
c(m,n)=1 m==n
c(0,n)=0

List *mhead,*nhead;
GetMList(list *ml,list* nl, int m, int n)
{
list *p=mhead;
if (m==0)
{//mhead为要求链表
while (p != ml)
{
printf("%d ", p->num);
p=p->next;
}
printf("%d\n", ml->num);
return;
}
if (m==n)
{//mhead+nl为要求链表
while (p != ml)
{
printf("%d ", p->num);
p=p->next;
}
printf("%d ", p->num);
while (nl)
{
printf("%d ", nl->num);
nl=nl->next;
}
printf("\n");
return;
}

}
phoenixzz 2003-05-09
  • 打赏
  • 举报
回复
上面没写完,下面是正确的
排列组合方法:
例如从十个里面取3个:
for(i=0; i<10; i++)
{
for(j=i+1; j<10; j++)
{
for (k=j+1; k<10; k++)
{
cout<<i<<j<<k;
}
}
}
phoenixzz 2003-05-09
  • 打赏
  • 举报
回复
排列组合方法:
例如从十个里面取3个:
for(i=0; i<10; i++)
{
for(j=i+1; j<10; j++)
common_man 2003-05-09
  • 打赏
  • 举报
回复
好!
syl08341 2003-05-09
  • 打赏
  • 举报
回复
你的问题是不是还没有解决,如果没有的话。
把问题在写的清楚一点。
今天晚上上网时,再帮你编写一下。
syl08341 2003-05-09
  • 打赏
  • 举报
回复
同意 regainworld(午夜心跳)。
我也认为应该用递归,以前做过一个类似的排列组合问题。
魔方阵。一个古老的数学问题。
当时就是用递归写的。
不过很长时间没有写过了。
所以现在写递归函数,
一是编写太慢,
二是没有绝对把握。
象phoenixzz(小百货) 的方法和我用的一样。
这种方法是最笨的方法。优点是不易出错,
并且易于检查。
缺点是不如递归容易升级。
common_man 2003-05-08
  • 打赏
  • 举报
回复
up
common_man 2003-05-08
  • 打赏
  • 举报
回复
还请各位多多指教!!
common_man 2003-05-08
  • 打赏
  • 举报
回复
to syl08341(沈阳老零) :
谢了!!!!
好人一生平安!
syl08341 2003-05-08
  • 打赏
  • 举报
回复
我用的方法是最笨的方法。
如果发现有更笨的方法,告诉我。
由于很长时间没有写链表方面的程序了。
所以许多地方写的非常差。
syl08341 2003-05-08
  • 打赏
  • 举报
回复
编写了半个小时,总算编写出来了。
能够实现你据说的,不过由于看错了一点,
所以写为了在六个数中取两个数的链表了。
想改成四个数中取两个数还是非常简单的。
#include <stdio.h>

struct node
{
int num;
node *next;
};

node *head = NULL;
int count = 0;

node *insert(int n)
{
node *p=new node;
node *q, *w = head;
while(w)
{
q = w;
w = w->next;
}
q->next = p;
p->next = NULL;
p->num = n;
return p;
}

node *get(int n)
{
node *p = head->next;
for(int i = 1; i < n; i++)
p = p->next;
return p;
}

void display(node *p)
{
count++;
while(p)
{
printf("%d\t", p->num);
p = p->next;
}
printf("\n");
if(count % 10 == 0)
{
printf("press any key to continue...");
getchar();
}
}

void main()
{
head = new node;
head->next = NULL;
for(int i = 1; i < 7; i++)
insert(i);
for(i = 1; i < 7; i++)
{
for(int j = 1; j < 7; j++)
{
if(j == i)
continue;
node *newhead = new node;
node *end = new node;
newhead->num = get(i)->num;
newhead->next = end;
end->num = get(j)->num;
end->next = NULL;
display(newhead);
}
}
}
syl08341 2003-05-08
  • 打赏
  • 举报
回复
我试着编写了一下,太麻烦了。
题目倒不难,就是太麻烦。
BlueSky2008 2003-05-08
  • 打赏
  • 举报
回复
参见该贴中我的方法
http://expert.csdn.net/Expert/topic/1217/1217747.xml?temp=.5448877
common_man 2003-05-08
  • 打赏
  • 举报
回复
我再up,up ,up
common_man 2003-05-08
  • 打赏
  • 举报
回复
up
common_man 2003-05-08
  • 打赏
  • 举报
回复
up

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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