#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define max2(a, b) (a>b ? a : b)
#define max4(a, b, c, d) (((a>b && a>c && a>d) ? a : ((b>c && b>d) ? b : ((c > d) ? c : d))))

int knapsack(int oggetti, int zaino, int pesi[], int valori[]);

int ***matrix;

int main() {
  int oggetti = 4;
  int zaino = 10;
  int pesi[4] = {5,4,6,3};
  int valori[4] = {10,40,30,50};
  int i, j;

  matrix = calloc(oggetti, sizeof(int));
  if(matrix == NULL) {
    printf("Allocazione 1 fallita");
  }
  
  for(i=0; i<=oggetti; i++) {
    matrix[i] = calloc(zaino, sizeof(int));
    if(matrix[i] == NULL) {
      printf("Allocazione 2.%d fallita", i);
    }

    for(j=0; j<=zaino; j++) {
      matrix[i][j] = calloc(2, sizeof(int));
      if(matrix[i][j] == NULL) {
        printf("Allocazione 3.%d.%d fallita", i, j);
      }

      memset(matrix[i][j], 0, sizeof(int));
    }
  }

  printf("Max value = %d\n", knapsack(oggetti, zaino, pesi, valori));

  return 0;
}

int knapsack(int oggetti, int zaino, int pesi[], int valori[]) {
  int i, j, k;
  int a, b;

  k=1;
  i=1;

  while(i<=oggetti) {          // scandisce tutti gli oggetti
    for(j=0; j<=zaino; j++) {  // scandisce tutti gli "spazzi unitari" dello zaino
      if(pesi[i-1]<=j) {       // se la soluzione in esame sta nello zaino
        matrix[i][j][k] = max4(matrix[i-1][j][k-1], matrix[i-1][j][k], valori[i-1]+matrix[i][j-pesi[i-1]][k-1], valori[i-1]+matrix[i-1][j-pesi[i-1]][k]);  // confronto la soluzione migliore precedente con la soluzione in esame sommata agli altri oggetti che ci possono stare assieme
      }
      else{
        matrix[i][j][k] = max2(matrix[i][j][k-1], matrix[i-1][j][k]);  // confronto la sola soluzione attuale con la sola funzione precedente
      }
    }

    if(i==oggetti) {
      if(matrix[i][j-1][k] == matrix[i][j-1][k-1]) {
        break;
      }

      i=1;
      k++;

      for(a=0; a<=oggetti; a++) {
        for(b=0; b<=zaino; b++) {
          matrix[a][b] = realloc(matrix[a][b], sizeof(int)*k);
          if(matrix[a][b] == NULL) {
            printf("Allocazione 4.%d.%d fallita", a, b);
          }

          memset(matrix[a][b], 0, sizeof(int));
        }
      }
	}
    else {
      i++;
	}
  }

  return matrix[oggetti][zaino][k];
}

Per maggiori informazioni circa la sintassi del linguaggio si faccia riferimento alla guida al Linguaggio C.