Cod sursa(job #1786584)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 23 octombrie 2016 12:40:59
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#define INF 2000000000
//d[i][e]=costul minim pentru a genera energie =>e cu primele i gen
//d[i][e]=max(d[i-1][e],d[i-1][e-v[i].e]+v[i].c)
struct generator{
  int e, c;
} v[1001];
int d[2][5001];
inline int min(int a, int b){
  return a<b ? a:b;
}
inline int max(int a, int b){
  return a>b ? a:b;
}
int main()
{
  int n, w, S, i, j, rasp, I;
  FILE *fi=fopen("energii.in", "r"), *fo=fopen("energii.out", "w");
  fscanf(fi, "%d%d", &n, &w);
  S=0;
  for(i=0;i<n;i++){
    fscanf(fi, "%d%d", &v[i].e, &v[i].c);
    S+=v[i].e;
  }
  if(S<w){
    fprintf(fo, "-1");
    fclose(fi);
    fclose(fo);
    return 0;
  }
  rasp=INF;
  i=0;
  for(I=1;I<=n;I++){
    for(j=0;j<v[I].e;j++)
      d[i][j]=d[1-i][j];
    for(j=v[I].e;j<=w;j++)
      d[i][j]=max(d[1-i][j],d[1-i][j-v[I].e]+v[I].c);
    for(j=0;j<=v[I].e;j++)
      if(d[1-i][w-j]!=0)
        rasp=min(rasp,d[1-i][w-j]+v[I].c);
    i=1-i;
  }
  rasp=min(rasp,d[1-i][w]);
  fprintf(fo, "%d", rasp);
  fclose(fi);
  fclose(fo);
  return 0;
}