Pagini recente » Cod sursa (job #2344191) | Cod sursa (job #1153603) | Cod sursa (job #1680033) | Cod sursa (job #275774) | Cod sursa (job #342799)
Cod sursa(job #342799)
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string.h>
#define MAXN 1000000
#define MAXG 1024
using namespace std;
struct generator
{
long long int c;
long long int e;
};
long long int best[MAXN];
bool viz[MAXN];
vector<generator> gn;
bool cmpf(const generator v1,const generator v2)
{
return v1.e > v2.e;
}
int main()
{
freopen("energii.in","r",stdin);
freopen("energii.out","w",stdout);
long long int lim,nrg,cmin,i,j,min = 99999999;
generator aux;
aux.e = 9999999;
aux.c = 1;
gn.push_back(aux);
scanf("%lld",&nrg);
scanf("%lld",&cmin);
for (i=1;i<=nrg;i++)
{
scanf("%lld%lld",&aux.e,&aux.c);
gn.push_back(aux);
}
sort(gn.begin(),gn.end(),cmpf);
best[0] = 0;
lim = cmin;
for (i=1;i<=nrg;i++)
{
memset(viz,0,sizeof(viz));
if (gn[i].c == 0)
{
best[0]+=gn[i].e;
viz[0] = true;
if (best[0] > lim)
{
lim= best[0];
}
if (best[0]>=cmin)
{
min = 0;
}
}
else if (best[gn[i].c]<gn[i].e)
{
best[gn[i].c] = gn[i].e;
viz[gn[i].c] = true;
if (gn[i].c > lim)
{
lim= gn[i].c;
}
if (best[gn[i].c]>=cmin)
{
if (gn[i].c<min)
{
min = gn[i].c;
}
}
}
for (j=0;j<=lim;j++)
{
if (viz[j])
{
viz[j] = false;
}
else if (best[j] != 0)
{
if (best[j+gn[i].c] < best[j]+gn[i].e)
{
best[j+gn[i].c] = best[j] + gn[i].e;
viz[j+gn[i].c] = true;
}
if (best[j] + gn[i].e>=cmin)
{
if (j+gn[i].c<min)
{
min = j+gn[i].c;
}
if (best[j] + gn[i].e > lim)
{
lim = best[j] + gn[i].e;
}
break;
}
}
}
}
if (min != 99999999)
{
printf("%lld",min);
}
else
{
printf("-1");
}
return 0;
}