2014-10-09 4 views
-1

동적 프로그래밍을 사용하여 이항 계수을 찾으려면 코드를 구현해야합니다. 그러나 나는 여기 내가 가지고있는 코드를 배열 B를 설정하는 방법을 모른다 : 당신은 즉석에서 메모리를 할당 할 <stdlib.h>에서 malloc()calloc() 기능을 사용할 수 있습니다배열 B [0..n] [0..k]를 설정하는 방법. 도와주세요

#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

'int B [n] [k]; '는 선언이 될 수 있고 for i 루프는'i mch

+1

관련 항목 : 만약 당신이 'B'의 선언을 고치지 만 코드는 'i'와'j' 차원의 마지막 주소 지정 가능한 슬롯을 지나서 하나의 요소를 실행하기 때문에 * 정의되지 않은 동작을 호출 할 것입니다 이온. C 배열은 0- 기본 인덱스입니다. 예 :'int A [N]'은 A [0]부터 A [N-1]까지 색인 가능합니다. – WhozCraig

+0

감사합니다. @mch는 k 값이 무엇이든 출력합니다. – user2909151

답변

0

. 0에서 n, 0에서 k까지 인덱스를 저장할 수 있기를 원하면 (n + 1) × (k + 1) 배열을 만들어야합니다. 이는 다음 + 1 int 값 각 포인터 K의 배열을 할당, N + 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 memory allocation을의에 대해 요구하고 dynamic programming되지 않고, better ways of calculating binomial coefficients이 있습니다.)