Cod sursa(job #212301)

Utilizator cata00Catalin Francu cata00 Data 5 octombrie 2008 00:05:00
Problema Energii Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>

#define INF 1000000000

int n, w;
int e[1010], c[1010];
int a[5010][1010];

void read() {
  FILE* f = fopen("energii.in", "rt");
  fscanf(f, "%d %d", &n, &w);
  for (int i = 1; i <= n; i++) {
    fscanf(f, "%d %d", &e[i], &c[i]);
  }
  fclose(f);
}

int get(int e, int g) {
  if (e <= 0) {
    return 0;
  } else if (g <= 0) {
    return INF;
  } else {
    return a[e][g];
  }
}

void compute() {
  for (int i = 1; i <= w; i++) {
    for (int j = 1; j <= n; j++) {
      a[i][j] = get(i, j - 1);
      int alt = get(i - e[j], j - 1) + c[j];
      if (alt < a[i][j]) {
        a[i][j] = alt;
      }
    }
  }
}

void debug() {
  for (int i = 1; i <= w; i++) {
    printf("%2d: ", i);
    for (int j = 1; j <= n; j++) {
      printf("%12d", a[i][j]);
    }
    printf("\n");
  }
}

void write() {
  FILE* f = fopen("energii.out", "wt");
  fprintf(f, "%d\n", (a[w][n] == INF) ? -1 : a[w][n]);
  fclose(f);
}

int main() {
  read();
  compute();
  //debug();
  write();
  return 0;
}