我必须使用动态编程实现代码以找到二项式系数。但我不知道如何设置数组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];
}
答案 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。)