返回信息流rt,求解
这是一条镜像帖。来源:北邮人论坛 / cpp / #36094同步于 2010/2/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
求助各位:从m个不同元素中选n个,输出情况,有好的算法吗
a206206
2010/2/25镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
用haskell好做。
choose lst 0 = []
choose [] n = []
choose x:xs n = [(x:rest) | rest <- choose xs (n-1)] ++ (choose xs n)
思路就是:从m个元素中选n个,就是两种情况:
1. 第一个被选中,剩下的选n-1个
2. 第一个不选,剩下的选n个
c语言貌似不太适合应付这种递归。
【 在 wks 的大作中提到: 】
: 另一种思路是:
: 前n个是一种组合。
: 对于某个组合,用另一个元素踢出其中一个,得到的也是一种组合。
第一个远远超出我的能力范围了,第二个到时能看懂,不过不怎么会实现
组合问题,
m不大的时候可以用二进制枚举, 标准解法是DFS
参考这个帖子
http://forum.byr.edu.cn/wForum/disparticle.php?boardName=CPP&ID=35155&pos=102
将所有元素顺序编号1...m
for( int i=0 ; i<m ; ++i )
{
if( rand()%(m-i)<n )
{
handleElement( i ) ;
--n ;
}
}
OR ls
【 在 wks 的大作中提到: 】
: 另外,Donald Knuth似乎对组合生成算法有独到的见解。TAOCP第四卷有介绍(可惜一直没找到这本。今天去国图特意找了这个,只找到第1,2,3卷)
R-Algorithm, 搜一下generating combination就能搜到了 高德纳的算法使用汇编写的,逐句转换成C语言如下
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, j=1, k, n, *c, x;
printf( "Enter n,k: ");
scanf( "%d,%d", &n, &k);
c = malloc( (k+3) * sizeof(int));
for (i=1; i <= k; i++) c[i] = i;
c[k+1] = n+1;
c[k+2] = 0;
j = k;
visit:
for (i=k; i >= 1; i--)
printf( "%3d", c[i]);
printf( "\n");
if (j > 0) {x = j+1; goto incr;}
if (c[1] + 1 < c[2]) {
c[1] += 1;
goto visit;
}
j = 2;
do_more:
c[j-1] = j-1;
x = c[j] + 1;
if (x == c[j+1]) {j++; goto do_more;}
if (j > k) exit(0);
incr:
c[j] = x;
j--;
goto visit;
}
没天理阿,怎么还带用goto的。。。。。。
【 在 jokerlee 的大作中提到: 】
:
: R-Algorithm, 搜一下generating combination就能搜到了 高德纳的算法使用汇编写的,逐句转换成C语言如下
: #include <stdio.h>
: ...................