Cod sursa(job #239736)

Utilizator marius21Marius Petcu marius21 Data 5 ianuarie 2009 18:05:00
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>

int n,w,add[15002],t[15002],enrg[15002],e[1001],c[1001];
int pass[1001];
bool ok[40401];
FILE *f=fopen("energii.in","r");
FILE *g=fopen("energii.out","w");

void parcurge(int poz){
	int i=poz,nr=1;
	pass[add[i]]=poz;
	while (t[i]!=-1) {
		i=t[i];
		pass[add[i]]=poz;
		nr++;
	} 
}

void writeit(int cost){
	fprintf(g,"%d\n",cost);
	fclose(f);
	fclose(g);
	exit(0);
}

int main (int argc,char *argv[]) {
	fscanf(f,"%d",&n);
	fscanf(f,"%d",&w);
	int i;	
	int s=0;
	for (i=0; i<n; i++) {
		fscanf(f,"%d %d",&e[i],&c[i]);
		if ((!ok[c[i]]) || (e[i]>enrg[c[i]])) {
			enrg[c[i]]=e[i];
			add[c[i]]=i;
			t[c[i]]=-1;
			ok[c[i]]=1;
			if (enrg[c[i]]>=w) {
				writeit(c[i]);
			}
		}
		if (s<w) {
			s+=e[i];
		}
	}
	if (s<w) {
		writeit(-1);
	}
	int j;
	for (i=1; i<=w+10001; i++) {
		if (ok[i]) {
			parcurge(i);
			for (j=0; j<n; j++) {
				if (pass[j]!=i) {
					if ((!ok[i+c[j]]) || (enrg[i]+e[j]>enrg[i+c[j]])) {
						enrg[i+c[j]]=enrg[i]+e[j];
						add[i+c[j]]=j;
						t[i+c[j]]=i;
						ok[i+c[j]]=1;
						if (enrg[c[j]+i]>=w) {
							writeit(c[j]+i);
						}
					}
				}
			}
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}