Cod sursa(job #419901)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 18 martie 2010 10:13:27
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
//Se da o suma S si n numere naturale. S<=10000
//Sa se scrie s folosind numerele date, pe fiecare cel mult o data
#include <stdio.h>
#define INF 1<<30

int E[1002];
int C[1002];
int W,N;

int v[10001];
int i,j,pmax;

int main(){
	FILE *f = fopen("energii.in","r");
	fscanf(f,"%d %d",&N,&W);
	for (i=1;i<=N;i++)
		fscanf(f,"%d %d",&E[i],&C[i]);

//	v[i] = costul minim de a obtine cantitate i de energie
	
	for (i=1;i<=W;i++)
		v[i] = INF;
	v[0] = 0;
	pmax = 0;
	for (i=1;i<=N;i++) {
		for (j=pmax;j>=0;j--)
			if (v[j]!=INF) {
				if (j+E[i]<=W) {
					if (v[j]+C[i]<v[j+E[i]])
						v[j+E[i]] = v[j]+C[i];
					if (j+E[i]>pmax)
						pmax = j+E[i];
				} else {//j+E[i]>W
					if (v[W]>v[j]+C[i]) {
						v[W] = v[j]+C[i];
						pmax = W;
					}
				}
				//obtin j+E[i]
			}
	}
	
	FILE *g = fopen("energii.out","w");
	if(v[W] == INF)
		fprintf(g,"-1");
	else
		fprintf(g,"%d",v[W]);
	fclose(g);
	
	fclose(f);
	
	return 0;
}