Cod sursa(job #4302)

Utilizator CezarMocanCezar Mocan CezarMocan Data 2 ianuarie 2007 15:41:08
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream.h>
#include<iomanip.h>
fstream fin("energii.in",ios::in);
fstream fout("energii.out",ios::out);
long long g,w,c[11000],e[11000],v[11000],i,j,ct=0,et=0,min;

int main(){
 fin>>g>>w;min=2000;
 for(i=1;i<=g;i++){fin>>e[i]>>c[i];ct+=c[i];et+=e[i];if (e[i]<min) min=e[i];}
 //daca nu am energia necesara scriu -1
 if (et<w) {fout<<-1; fin.close();fout.close();return 0;}  
 if (et-min<w) {fout<<ct; fin.close();fout.close();return 0;}      
 for(i=1;i<=g;i++){
 //daca energia prod de generatorul i este mai mare decat energia de pornire       
  if (e[i]>=w) if (c[i]<ct) ct=c[i];
               else;
  else{
   for(j=w-1;j>=1;j--)       
   //daca pot obtine energia j
    if (v[j]){   
     if (e[i]+j>=w)
      if (c[i]+v[j]<ct) ct=c[i]+v[j];//actualizez ct
      else;
     else
      //daca abia acum am obtinut energia e[i]+j atunci retin costul
      if (v[j+e[i]]==0) v[j+e[i]]=v[j]+c[i];
      //altfel daca am cost mai mic actualizez
      else if (v[j]+c[i]<v[j+e[i]]) v[j+e[i]]=v[j]+c[i];
           else;    
    }
   //actualizez energia e[i]                           
   if ((v[e[i]]==0)||(c[i]<v[e[i]])) v[e[i]]=c[i];           
   } 
  }    
 //for(i=1;i<=w-1;i++) fout<<v[i]<<" ";fout<<endl;    
 fout<<ct;
 fin.close();fout.close();
 return 0;        
}
/*10
20
1 3
2 4
5 8
6 10
11 3
5 10
17 40
8 4
9 17
18 500
*/