Cod sursa(job #1423026)

Utilizator stan_catalinUTCN-STAN-CATALIN-GABRIEL stan_catalin Data 20 aprilie 2015 21:13:57
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>


#define IN_FILE_NAME "energii.in"

#define OUT_FILE_NAME "energii.out"

#define MAX_G 1002
#define MAX_W 5002


void energii(){
	int g;
	int w;
	int energi[MAX_G];
	int cost[MAX_G];
	int sume[MAX_W];
	int i,j;	
	int maxSumReached = 0;
	int auxSum = 0;
	int auxCost = 0;
	int maxSumToBe = 0;
	int minimumCost = INT_MAX;

	FILE *fin;
	FILE *fout;

	fin = fopen(IN_FILE_NAME,"r");
	fout = fopen(OUT_FILE_NAME,"w");

	fscanf(fin,"%d",&g);
	fscanf(fin,"%d",&w);

	for(i = 0 ; i < g; i++){
		fscanf(fin,"%d",&energi[i]);
		fscanf(fin,"%d",&cost[i]);
	}

	for(i = 0; i<=w; i++){
		sume[i] = INT_MAX;
	}

	//pentru toate generatoarele, aplic algoritmul de update a sumelor
	for(i = 0; i < g; i++){		
		for(j = maxSumReached; j>=0; j--){
			if(sume[j] != INT_MAX){
				auxSum = j + energi[i];
				auxCost = sume[j] + cost[i];
				if(auxSum>=w){
					if(auxCost < minimumCost){
						minimumCost = auxCost;
					}
				}
				else{
					if(auxCost<sume[auxSum]){
						sume[auxSum] = auxCost;
						if(maxSumToBe < auxSum){
							maxSumToBe = auxSum;
						}
					}
				}
			}
		}
		if(sume[energi[i]] > cost[i]){
			if(maxSumToBe < energi[i]){
				maxSumToBe = energi[i];
			}
			if(sume[energi[i]] > cost[i]){
				sume[energi[i]] = cost[i];
			}			
		}
		maxSumReached = maxSumToBe;
	}
	

	if(minimumCost > sume[w]){
		minimumCost = sume[w];
	}
	if(minimumCost == INT_MAX){
		fprintf(fout,"-1");
	}
	else {
		fprintf(fout,"%d",minimumCost);
	}
	fclose(fin);
	fclose(fout);


}

int main(){

	energii();
	return 0;
}