Cod sursa(job #605273)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 27 iulie 2011 15:16:44
Problema Energii Scor 55
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <stdlib.h>

#define nmax 1002
#define mmax 5002
#define maxxx 1000000

int main () {

	freopen ("energii.in", "r", stdin);
	freopen ("energii.out", "w", stdout);

	int **mat, 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;

	mat = malloc (g * sizeof (int *));

	if (m < mmax)
		max = m;
	else
		max = mmax;

	for (i = 0; i < g; i++)
		mat[i] = malloc (max * sizeof (int));


	for (i = 0; i < g; i++)
		for (j = 0; j < max; 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 < max; 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 ) && ten < max)
					mat[i][ten] = tc;
			}

		for (j = 0; j < max; 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 < max; j++)
		if (min > mat[g-1][j] && mat[g-1][j] != -1)
			min = mat[g-1][j];

/*
	for (i = 0; i < g; i++) {
		for (j = 0; j < m; j++)
			printf ("%d ", mat[i][j]);
		printf ("\n");
	}
*/

	if (min == maxxx)
		printf ("-1\n");
	else
		printf ("%d\n", min);

	return 0;
}