Cod sursa(job #1317466)

Utilizator dodgerblueBogdan P. dodgerblue Data 14 ianuarie 2015 22:03:57
Problema Energii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

#define INFILE "energii.in"
#define OUTFILE "energii.out"

/* m[i][j] - minimum cost for elements from 1 .. i that produc min w energy */
unsigned int m[1002][5002];
unsigned int G, W;
unsigned int E[1002], C[1002];
#define MAX 1000000000

void read() {
	FILE *f = fopen(INFILE, "r");
	int i;

	fscanf(f, "%u\n", &G);
	fscanf(f, "%u\n", &W);

	for (i = 1; i <= G; i++)
		fscanf(f, "%u %u\n", &E[i], &C[i]);

	fclose(f);
}

void write() {
	FILE *f = fopen(OUTFILE, "w");

	if (m[G][W] == MAX)
		fprintf(f, "-1\n");
	else
		fprintf(f, "%u\n", m[G][W]);

	fclose(f);
}

unsigned int min(unsigned int a, unsigned int b) {
	if (a < b) return a;
	return b;
}

void compute() {
	int i, j, least, cur;

	/* Initialize matrix */
	for (i = 0; i <= W; i++)
		m[0][i] = MAX;

	for (i = 1; i <= G; i ++) {
		least = MAX;
		for (j = W; j > 0; j --) {
			cur = m[i-1][j];
			if (j >= E[i])
				cur = min(cur, m[i-1][j-E[i]] + C[i]);
			if (cur < least)
				least = cur;
			m[i][j] = least;
		}
	}

}

int main() {
	read();
	compute();
	write();
	return 0;
}