Cod sursa(job #404407)

Utilizator Cristi09Cristi Cristi09 Data 26 februarie 2010 09:09:10
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
int g,w,p[1002],c[1002],a[5003][5003],m=999999,sum[5003][1003];//v[0][..]energie,v[1][..]costul
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",&p[i],&c[i]);
	}
	fclose(f);
}
void copy(int x,int lin)
{
	int ct=0;
	for(;sum[x][ct];++ct)
	{
		sum[lin][ct+1]=sum[x][ct];
		a[lin][sum[x][ct]+1]=1;
	}
}
int dinamic()
{
	int i,j,pos=1,var,ct;
	a[0][0]=0;
	for(i=1;i<=w;++i)
	{
		a[i][0]=99999999;
		pos=-1;
		for(j=0;j<g;++j)
		{
			var=i-p[j];
			if(i-p[j]<0)var=0;
			if((a[var][0]!=c[j]&&var!=p[j]||a[var][0]!=c[j]||var!=p[j])&&!a[var][j])//??
			{
				if(c[j]+a[var][0]<a[i][0]){a[i][0]=c[j]+a[var][0];pos=j;}
			}
		}
		a[i][pos]=1;
		sum[i][0]=pos;
		if(var>0)copy(var,i);	
	}
	if(a[w][0]==99999999)return -1;
	return a[w][0];
}
int main()
{
	read();
	FILE*g=fopen("energii.out","w");
	fprintf(g,"%d\n",dinamic());
	fclose(g);
	return 0;
}