Cod sursa(job #596536)

Utilizator stefanzzzStefan Popa stefanzzz Data 17 iunie 2011 18:01:27
Problema Energii Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream.h>
#define MAX 2000000000

int g, w, eg[1001], cg[1001], cmin[5001], emin[5001];
bool uz[5001][1001];

void citire();
void calcul();


main(){
	freopen("energii.in", "r", stdin);
	freopen("energii.out", "w", stdout);
	citire();
	calcul();
	if(cmin[w])
		printf("%d", cmin[w]);
	else
		printf("-1");
}

void citire(){
	int i;
	scanf("%d%d", &g, &w);
	for(i=1;i<=g;i++)
		scanf("%d%d", &eg[i], &cg[i]);}

void calcul(){
	int mine,jj;
	long minc;
	for(int i=1;i<=w;i++){
		minc=MAX;
		for(int j=1;j<=g;j++){
			if(i-eg[j]>0){
				if(eg[j]>=i-emin[i-eg[j]]&&uz[i-eg[j]][j]==0&&minc>cmin[i-eg[j]]+cg[j]){
					minc=cmin[i-eg[j]]+cg[j];
					mine=emin[i-eg[j]]+eg[j];
					jj=j;}}
			else{
				if(eg[j]>=i&&minc>cg[j]){
					minc=cg[j];
					mine=eg[j];
					jj=j;}}}		
		if(minc!=MAX){
			cmin[i]=minc;
			emin[i]=mine;
			if(i-eg[jj]>0){
				for(int k=1;k<=g;k++){
					if(uz[i-eg[jj]][k])
						uz[i][k]=1;}}
			uz[i][jj]=1;}}}