- 论坛徽章:
- 0
|
本帖最后由 haipome 于 2012-04-07 01:37 编辑
这是一个组合问题,即从 2n 个数中取出 n 个,一共有多少种取法。类似与这种问题使用递归最好了,将问题简化为:从一个长为 lena 数组 a 里从 s 开始取出 n 个放在长度为 lenb 的数组 b 里,如果 n 等于 1 则递归结束,输出 数组 b. 代码如下:- #include <stdio.h>
- #include <stdlib.h>
- int sum = 0;
- void print(int list[], int l)
- {
- int i;
- for (i = 0; i < l; ++i) {
- printf("%d ", list[i]);
- }
- putchar('\n');
- }
- int * listcopy(int list[], int l, int nin)
- {
- int * copy = malloc(sizeof(int) * (l - 1));
- int i, j = 0;
- for (i = 0; i < l; i++) {
- if (i != nin) {
- copy[j++] = list[i];
- }
- }
- return copy;
- }
- void listfree(int * list)
- {
- free(list);
- }
- int zuhe(int a[], int lena, int s, int n, int b[], int lenb)
- {
- int i;
- int * a2;
- for (i = s; i < lena; ++i) {
- b[lenb] = a[i];
- a2 = listcopy(a, lena, i);
- if (n == 1) {
- print(b, lenb + 1);
- print(a2, lena - 1);
- putchar('\n');
- ++sum;
- } else {
- zuhe(a2, lena - 1, i, n - 1, b, lenb + 1);
- }
- listfree(a2);
- }
- }
- int main()
- {
- int a[6] = {1, 2, 3, 4, 5, 6,};
- int b[6];
-
- zuhe(a, 6, 0, 3, b, 0);
- printf("%d\n", sum);
- return 0;
- }
复制代码 这段程序没有考虑重复的问题,实际上的总数是输出的一半,具体你来实现吧。 |
|