Cod sursa(job #96092)

Utilizator pantaniMarco Pantani pantani Data 31 octombrie 2007 13:25:45
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#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;
}