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

标签 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];
}

最佳答案

您可以使用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 。)

关于c - 如何设置数组 B[0..n][0..k]。请帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286259/

相关文章:

php - 如何使用 PHP 根据索引值对数组进行排序

C# - 更改函数内的数组值

arrays - 交换两个元素时更新数组的最大和子间隔

Python:从 DataFrame 中的两列创建结构化 numpy 结构化数组

c - 链接外部静态结构数组无法正常工作

c - 用html代码定义一个字符串

将 int 转换为 uint8_t 数组十六进制值

c - 为什么在 strcpy 改变它的值之后 tt[9] 是 '4'?

c - 在 C 中将 char 数组作为参数传递为指针

javascript - JS中将数据压入多维数组