如何设置数组B [0..n] [0..k]。请帮忙

时间:2014-10-09 19:16:11

标签: c arrays

我必须使用动态编程实现代码以找到二项式系数。但我不知道如何设置数组B.这里是我的代码:

#include <stdio.h>

int minimum(int a, int b) { return (a < b) ? a : b; }

main() {
    int n = 50, k;
    printf("Enter value for k:");
    scanf("%d", &k);
    printf("Value of coefficient %d, %d is: %d\n", n, k, bin2(n, k));

    return 0;
}

// code to be implemented

int bin2(int n, int k) {
    int i, j;

    // array to initialize. Help
    int B[0..n][0..k];

    for (i = 0; i <= n; i++)
        for (j = 0; j <= minimum(i, k); j++)
            if (j == 0 || j == i)
                B[i][j] = 1;
            else
                B[i][j] = B[i - 1][j - 1] + B[i - 1][j];
    return B[n][k];
}

1 个答案:

答案 0 :(得分:0)

您可以使用malloc()中的calloc()<stdlib.h>函数动态分配内存。由于您希望能够存储从0到n和0到k的索引,因此必须创建(n + 1)×(k + 1)数组。这是通过分配一个n + 1 int*指针的数组,然后为每个指针分配一个k + 1 int值的数组来完成的:

    /* Initialize array */
    B = malloc((n+1) * sizeof(int*));
    for (i=0; i<=n; i++) B[i] = calloc((k+1), sizeof(int));

当您的函数退出时,仍会分配此内存,但您将无法再访问它,因为B的值是bin2()函数的本地值,并且将永久丢失。 (这称为memory leak。)

所以你需要在返回前释放这个内存:

    int result = B[n][k];

    /* Dispose of array */
    for (i=0; i<=n; i++) free(B[i]);
    free(B);

    return result;
}

(顺便说一句,这不是dynamic programming你问的问题,而是dynamic memory allocation。还有better ways of calculating binomial coefficients。)