Cod sursa(job #1263342)

Utilizator hrazvanHarsan Razvan hrazvan Data 14 noiembrie 2014 17:33:00
Problema Lapte Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#define MAXIN 100
#define INF 2000000000
int a[MAXIN], b[MAXIN], d[MAXIN][MAXIN + 1], lbi[MAXIN][MAXIN], rez[MAXIN];

char bun(int t, int n, int l){
  int i, j, k, c;
  for(i = 0; i < n; i++){
    for(j = 0; j <= l; j++){
      d[i][j] = -INF;
    }
  }
  for(i = 0; i < n; i++){
    for(j = 0; j <= l; j++){
      if(i == 0){
        d[i][j] = (t - j * a[i]) / b[i];
        lbi[i][j] = j;
      }
      else{
        for(k = 0; k <= j && t >= (k * a[i]); k++){
          c = d[i - 1][j - k] + (t - k * a[i]) / b[i];
          if(d[i][j] < c){
            d[i][j] = c;
            lbi[i][j] = k;
          }
        }
      }
    }
  }
  return d[n - 1][l] >= l;
}

void refac(int n, int l){
  while(n >= 0){
    rez[n] = lbi[n][l];
    l -= rez[n];
    n--;
  }
}

int main(){
  FILE *in = fopen("lapte.in", "r");
  int n, l, i;
  fscanf(in, "%d%d", &n, &l);
  for(i = 0; i < n; i++){
    fscanf(in, "%d%d", &a[i], &b[i]);
  }
  fclose(in);
  int pas;
  i = 0;
  for(pas = 1 << 14; pas > 0; pas >>= 1){
    if(!bun(i + pas, n, l))
      i += pas;
  }
  i++;
  bun(i, n, l);
  FILE *out = fopen("lapte.out", "w");
  fprintf(out, "%d\n", i);
  refac(n - 1, l);
  int j;
  for(j = 0; j < n; j++){
    fprintf(out, "%d %d\n", rez[j], (i - rez[j] * a[j]) / b[j]);
  }
  fclose(out);
  return 0;
}