Cod sursa(job #95064)

Utilizator piroslPiros Lucian pirosl Data 27 octombrie 2007 01:47:08
Problema Energii Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <stdlib.h>

//const int maxsize = 10011001;
const int maxsize = 1001;

int ee[1001];
int cg[1001];
int a[maxsize];
int pozitii[1001];
int predecesor[1001];

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 count = 0;
	int i=0;
	for(;i<g;++i)
	{
		int ee1, cg1;
		fscanf(fin, "%d %d\n", &ee1, &cg1);
		ee[i] = ee1;
		cg[i] = cg1;
	}
	fclose(fin);

	bool found = false;
	a[0] = 0;
	for(int k=0;k<g;++k)
	{
		if(cg[k] == 0)
			a[0] += cg[k];
	}

	i = 1;
	for(;i<maxsize;++i)
	{
		int m = a[0];
		int poz = -1;
		int pred = 0;
		for(int k=0;k<g;++k)
		{
			if(cg[i] > 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;
}