Cod sursa(job #605167)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 27 iulie 2011 00:08:08
Problema Energii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>

#define nmax 1002
#define mmax 1000002
#define maxxx 1000000

int main () {

	freopen ("energii.in", "r", stdin);
	freopen ("energii.out", "w", stdout);
	
	int mat[nmax][mmax], cost[nmax], en[nmax], g, w, i, j, m;
	int min, max, ten, tc;

	
	scanf ("%d%d", &g, &w);
	
	min = maxxx;
	max = 0;
	
	for (i = 0; i < g; i++) {
		scanf ("%d%d", &en[i], &cost[i]);
		if ( en[i] < min)
			min = en[i];
		max += en[i];
	}

	m = max - min + 1;
	for (i = 0; i < g; i++)
		for (j = 0; j < m; j++)
			mat[i][j] = -1;
	
	mat [0][en[0] - min] = cost[0];
	
	for (i = 1; i < g; i++) {
		mat[i][en[i] - min] = cost[i];
		
		for (j = 0; j < m; j++) 
			if (mat[i-1][j] != -1) {
				ten = en[i] + j;
				tc = cost[i] + mat[i-1][j];
				if (mat[i][ten] > tc || mat[i][ten] == -1)
					mat[i][ten] = tc;
			}
		
		for (j = 0; j < m; j++)
			if (mat[i - 1][j] != -1 && 
				(mat[i][j] == -1 || mat[i][j] > mat[i-1][j]))
				mat[i][j] = mat[i-1][j];
		
	}
	
	w -= min;
	min = maxxx;	
	
	for (j = w ; j < m; j++)
		if (min > mat[g-1][j] && mat[g-1][j] != -1)
			min = mat[g-1][j];

	printf ("%d\n", min);
	
	fclose (f);
	fclose (g);

	return 0;
}