Cod sursa(job #222539)
using namespace std;
#include<stdio.h>
const int GMAX=1005, WMAX=10005;
int G,W,v[GMAX][3],rez[10005];
void citire()
{
int i;
freopen("energii.in","r",stdin);
scanf("%d%d",&G,&W);
for(i=1;i<=G;++i)
{
scanf("%d%d",v[i][1],v[i][2]);
}
}
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;
if(rez[j+v[i][1]] && 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];
if(rez[v[i][1]] && rez[v[i][1]]>=v[i][2])//aceeasi comparatie pt a determina minimul pe acea portiune;
rez[v[i][1]]=v[i][2];
}
for(i=W;i<WMAX;++i)
if(rez[i] && rez[i]<=min)
min=rez[i];
if(min==WMAX)
min=-1;
return min;
}
int main()
{
freopen("energii.out","w",stdout);
citire();
printf("%d",calcul());
return 0;
}