Cod sursa(job #2588013)

Utilizator anabatAna Batrineanu anabat Data 24 martie 2020 12:06:53
Problema Energii Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <algorithm>

#define NMAX 10001
#define WMAX 5001
#define INF 1000000000

struct energii {
  int cant;
  int cost;
};
struct energii v[NMAX+1];

int d[2][WMAX+1];

int main()
{
  FILE *fin,*fout;
  fin=fopen("energii.in","r");
  fout=fopen("energii.out","w");

  int n,W,i,j,total,MIN;
  fscanf(fin,"%d%d",&n,&W);
  total=0;
  for(i=1;i<=n;i++){
    fscanf(fin,"%d%d",&v[i].cant,&v[i].cost);
    total+=v[i].cant;
  }
  if(total<W){
    fprintf(fout,"-1");
  }
  else{
    for(i=0;i<=n;i++){
      for(j=1;j<=WMAX;j++){
        d[i%2][j]=INF;
      }
    }
    d[0][0]=0;
    ///d[1][v[1].cant]=v[1].cost; //initializare

    for(i=1;i<=n;i++){
      d[0][0]=0;
      for(j=v[i].cant;j<=WMAX;j++){
        d[i%2][j]=std::min(d[i%2][j], d[(i-1)%2][j-v[i].cant]+v[i].cost);
        d[i%2][j]=std::min(d[i%2][j], d[(i-1)%2][j]);
      }
    }
    MIN=INF;
    for(j=W;j<=total;j++){
      if(d[n%2][j]<MIN){
        MIN=d[n%2][j];
      }
    }
    fprintf(fout,"%d",MIN);
  }

  fclose(fin);
  fclose(fout);
  return 0;
}