Pagini recente » Monitorul de evaluare | Cod sursa (job #892469) | Cod sursa (job #1264495) | Cod sursa (job #2514514) | Cod sursa (job #96092)
Cod sursa(job #96092)
#include <stdio.h>
#include <stdlib.h>
const int maxsize = 1001 * 10001;
//const int maxsize = 1001;
int ee[1002];
int cg[1002];
int a[maxsize];
int pozitii[maxsize];
int predecesor[maxsize];
bool notInPart(int v, int k)
{
int l = v;
while(l>=0)
{
if(k == pozitii[l])
return false;
l = predecesor[l];
}
return true;
}
int main(void)
{
FILE *fin;
FILE* fout;
fin = fopen("energii.in", "r");
fout = fopen("energii.out", "w");
int g;
int w;
fscanf(fin, "%d\n", &g);
fscanf(fin, "%d\n", &w);
int i=0;
int total = 0;
int total1 = 0;
for(;i<g;++i)
{
int ee1, cg1;
fscanf(fin, "%d %d\n", &ee1, &cg1);
ee[i] = ee1;
cg[i] = cg1;
total += ee1;
total1 += cg1;
}
fclose(fin);
bool found = false;
a[0] = 0;
for(int k=0;k<g;++k)
{
if(cg[k] == 0)
a[0] += ee[k];
}
if(a[0] >= w)
{
fprintf(fout, "0\n");
fclose(fout);
return 0;
}
if(total < w)
{
fprintf(fout, "-1\n");
fclose(fout);
return 0;
}
i = 1;
pozitii[0] = -1;
predecesor[0] = -1;
for(;i<=maxsize;++i)
{
int m = a[0]-1;
int poz = -1;
int pred = -1;
for(int k=0;k<g;++k)
{
if(cg[k] > 0 && cg[k] <= i && notInPart(i-cg[k], k))
{
if(ee[k] + a[i-cg[k]] > m)
{
m = ee[k] + a[i-cg[k]];
poz = k;
pred = i-cg[k];
}
}
}
a[i] = m;
pozitii[i] = poz;
predecesor[i] = pred;
if(a[i] >= w)
{
found = true;
break;
}
}
if(found)
fprintf(fout, "%d\n", i);
else
fprintf(fout, "-1\n");
fclose(fout);
return 0;
}