Cod sursa(job #1224485)

Utilizator allexx2200Atanasiu Alexandru-Marian allexx2200 Data 31 august 2014 10:40:37
Problema Energii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <limits.h>

#define FIN "energii.in"
#define FOUT "energii.out"

#define GEN 1002
#define ENERG 5002
#define MIN(a,b) ((a)<(b))?(a):(b)

int EG[GEN], CG[GEN], G, W;
int co[GEN][ENERG];

int cost(){
	int i,j,S;
	
	for(i=1, S=0; i <= G; i++){
		S += EG[i]; 
	}
	if(S < W){
		return -1;
	}
	
	for(i=1; i <= W; i++){
		co[0][i] = INT_MAX;
	}
	
	for(i=1; i <= G; i++){
		for(j=1; j <= W; j++){
			if(EG[i] > j){
				co[i][j] = MIN(co[i-1][j], CG[i]);
			} else {
				if(co[i-1][j] == INT_MAX && co[i-1][j-EG[i]] == INT_MAX){
					co[i][j] = INT_MAX;
				} else if (co[i-1][j] == INT_MAX){
					co[i][j] = co[i-1][j-EG[i]] + CG[i];
				} else if (co[i-1][j-EG[i]] == INT_MAX){
					co[i][j] = co[i-1][j];
				} else {
					co[i][j] = MIN(co[i-1][j], co[i-1][j-EG[i]]+CG[i]);
				}
			}
		}
	}
	return co[G][W];
}


int main(){
	int i;
	
	FILE *in = fopen(FIN, "rt");
	FILE *out = fopen(FOUT, "wt");
	
	fscanf(in, "%d%d", &G, &W);
	for(i=1; i <= G; i++){
		fscanf(in, "%d%d", &EG[i], &CG[i]);
	}
	fprintf(out, "%d", cost());
	
	return 0;
}