Cod sursa(job #402853)

Utilizator Cristi09Cristi Cristi09 Data 24 februarie 2010 10:58:58
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
int g,w,v[2][1001];//v[0][..]energie,v[1][..]costul
struct mat
{
	int c,e;
}best[1001][1001];
void read()
{
	FILE*f=fopen("energii.in","r");
	fscanf(f,"%d%d",&g,&w);
	int i;
	for(i=0;i<g;++i)
		fscanf(f,"%d%d",&v[0][i],&v[1][i]);
	fclose(f);
}
int dinamic()
{
	int i,min=99999999,j,ok;
	
	for(i=0;i<g;++i)
	{
		best[i][i].e=v[0][i];
		best[i][i].c=v[1][i];
		if(best[i][i].e>=w&&best[i][i].c<min)
			min=best[i][i].c;
		for(j=0;j<g;++j)
		{
			if(i<=j)continue;
			ok=0;
				ok=1;
				best[i][j].e=v[0][j]+v[0][i];
				best[i][j].c=v[1][j]+v[1][i];
				if(best[i][j].c<min&&best[i][j].e>=w)min=best[i][j].c;
			
			if(i)
			{
				if(best[i-1][j].e+v[0][i]>=w)
				{
					//best[i][j].e=best[i-1][j].e+v[0][i];
					//best[i][j].c=best[i-1][j].c+v[1][i];
					//if(best[i][j].c<min&&best[i][j].e==w)min=best[i][j].c;
					if(best[i-1][j].c+v[1][i]<min)min=best[i-1][j].c+v[1][i];
				}
				else 
				{
					if(best[i-1][j].c+v[1][i]<best[i][j].c)
					{
						best[i][j].e=best[i-1][j].e+v[0][i];
						best[i][j].c=best[i-1][j].c+v[1][i];
					}
					if(best[i-1][j].c+v[1][i]==best[i][j].c&&best[i-1][j].e+v[0][i]>best[i][j].e)
					{
						best[i][j].e=best[i-1][j].e+v[0][i];
						best[i][j].c=best[i-1][j].c+v[1][i];
					}
				}
			}
		}
	}
	if(min==99999999)return -1;
	return min;
}
int main()
{
	read();
	FILE*g=fopen("energii.out","w");
	fprintf(g,"%d",dinamic());
	fclose(g);
	return 0;
}