Cod sursa(job #222544)
using namespace std;
#include<fstream>
const int GMAX=2005, WMAX=20005;
int G,W,v[GMAX][3],rez[WMAX];
void citire()
{
int i;
ifstream in("energii.in");
in>>G>>W;
for(i=1;i<=G;++i)
{
in>>v[i][1]>>v[i][2];
}
in.close();
}
int calcul()
{
int i,j, min=WMAX;
for(i=1;i<=G;++i)
{
if(v[i][1]<W)// nu mai are sens sa adaug daca energia unui singur generator e suficienta;
for(j=1;j<W;++j)//daca energia <W, nu am nevoie sa caut decat generatoare cu energia in [1;W);
if(rez[j])// daca se gaseste o suma de energii,
{
if(!rez[j+v[i][1]])
rez[j+v[i][1]]=rez[j]+v[i][2];// se adauga costul pt suma la costul pt generatorul ales intai;
else
if(rez[j+v[i][1]]>rez[j]+v[i][2])
rez[j+v[i][1]]=rez[j]+v[i][2];// OBS important!!! se compara valorile: ne intereseaza minimul!!!
}
if(!rez[v[i][1]])
rez[v[i][1]]=v[i][2];
else
if(rez[v[i][1]]>v[i][2])//aceeasi comparatie pt a determina minimul pe acea portiune;
rez[v[i][1]]=v[i][2];
}
j=0;
for(i=W;i<WMAX;++i)
if(rez[i]&& rez[i]<min)
{
j=1;min=rez[i];
}
if(j==0)
min=-1;
return min;
}
int main()
{
ofstream out("energii.out");
citire();
out<<calcul();
out.close();
return 0;
}