Cod sursa(job #705719)

Utilizator IronWingVlad Paunescu IronWing Data 4 martie 2012 20:23:54
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <climits>
#define MAX_GEN 1002
#define MAX_EN 5002
#define BIG_NO 1<<30
#define FOR(i, a, b) for (i = a; i <= b; ++i)


inline int min(int a, int b){
	return a < b? a : b;
}

int main(){	
	freopen("energii.in","r", stdin);
	freopen("energii.out","w", stdout);
	int g, w, eg[MAX_GEN], cg[MAX_GEN], **cmin, i, j;
	scanf("%d%d", &g, &w);
	FOR(i, 1, g){
		scanf("%d %d", eg + i, cg + i);
	}
	fclose(stdin);
	/* allocate the 2D e array */
	cmin = new int*[g+1];
	FOR(i,0,g){
		cmin[i] = new int[w+1];
	}

	/* compute the minimum cost in matrix cmin[i][j],
	the minimum cost of choosing from generators 1 to i, with a minimum energy requirement of j 
	*/
	FOR(j,0,w){
		cmin[0][j] = BIG_NO;
	}
	FOR(i,0, g){
		cmin[i][0] = BIG_NO;
	}
	FOR(i, 1, g){
		FOR(j,1,w){
			if(j > eg[i]){
				cmin[i][j] = min(cmin[i-1][j], cmin[i-1][j-eg[i]] + cg[i]);
			}
			else {
				cmin[i][j] = min(cmin[i-1][j], cg[i]);
			}
		}
	}
	printf("%d", cmin[g][w] != BIG_NO ? cmin[g][w] : -1);
	fclose(stdout);
	/* deallocate e 2D array */
	FOR(i, 0, g){
		delete[] cmin[i];
	}
	delete[] cmin;
	return 0;
}