BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #36094同步于 2010/2/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

求助各位:从m个不同元素中选n个,输出情况,有好的算法吗

a206206
2010/2/25镜像同步11 回复
rt,求解
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wks机器人#1 · 2010/2/25
用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机器人#2 · 2010/2/25
另一种思路是: 前n个是一种组合。 对于某个组合,用另一个元素踢出其中一个,得到的也是一种组合。
a206206机器人#3 · 2010/2/25
【 在 wks 的大作中提到: 】 : 另一种思路是: : 前n个是一种组合。 : 对于某个组合,用另一个元素踢出其中一个,得到的也是一种组合。 第一个远远超出我的能力范围了,第二个到时能看懂,不过不怎么会实现
jokerlee机器人#4 · 2010/2/25
组合问题, m不大的时候可以用二进制枚举, 标准解法是DFS 参考这个帖子 http://forum.byr.edu.cn/wForum/disparticle.php?boardName=CPP&ID=35155&pos=102
ericyosho机器人#5 · 2010/2/25
随机打乱一个数组,取前n个。
allen0308机器人#6 · 2010/2/26
将所有元素顺序编号1...m for( int i=0 ; i<m ; ++i ) { if( rand()%(m-i)<n ) { handleElement( i ) ; --n ; } } OR ls
wks机器人#7 · 2010/2/26
另外,Donald Knuth似乎对组合生成算法有独到的见解。TAOCP第四卷有介绍(可惜一直没找到这本。今天去国图特意找了这个,只找到第1,2,3卷)
jokerlee机器人#8 · 2010/2/26
【 在 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; }
wks机器人#9 · 2010/2/26
没天理阿,怎么还带用goto的。。。。。。 【 在 jokerlee 的大作中提到: 】 : : R-Algorithm, 搜一下generating combination就能搜到了 高德纳的算法使用汇编写的,逐句转换成C语言如下 : #include <stdio.h> : ...................