Cod sursa(job #95056)

Utilizator piroslPiros Lucian pirosl Data 27 octombrie 2007 01:27:04
Problema Energii Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <iostream>
using namespace std;

const int maxsize = 10011001;

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)
{
	ifstream in;
	ofstream out;
	in.open("energii.in");
	out.open("energii.out");
	int g;
	int w;
	in >> g;
	in >> w;
	int count = 0;
	int i=0;
	for(;i<g;++i)
	{
		int ee1, cg1;
		in >> ee1 >> cg1;
		ee[i] = ee1;
		cg[i] = cg1;
	}
	in.close();

	bool found = false;
	a[0] = 0;
	i = 1;
	for(;i<maxsize;++i)
	{
		int m = 0;
		int poz = -1;
		int pred = 0;
		for(int k=0;k<g;++k)
		{
			if(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)
		out << i << endl;
	else
		out << "-1" << endl;
	out.close();
	return 0;
}