Cod sursa(job #596530)

Utilizator stefanzzzStefan Popa stefanzzz Data 17 iunie 2011 17:28:52
Problema Energii Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream.h>
#define MAX 2000000000

int g, w, eg[1001], cg[1001], cmin[5001], emin[5001];
bool uz[5001][1001];
long s=0;

void citire();
void calcul();


main(){
	freopen("energii.in", "r", stdin);
	freopen("energii.out", "w", stdout);
	citire();
	if(s<w){
		printf("-1");
		return 0;}
	calcul();
	printf("%d", cmin[w]);
}

void citire(){
	int i;
	scanf("%d%d", &g, &w);
	for(i=1;i<=g;i++){
		scanf("%d%d", &eg[i], &cg[i]);
		s+=eg[i];}}

void calcul(){
	int mine,jj;
	long minc;
	for(int i=1;i<=w;i++){
		minc=MAX;
		for(int j=1;j<=g;j++){
			if(i-eg[j]>0){
				if(eg[j]>=i-emin[i-eg[j]]&&uz[i-eg[j]][j]==0&&minc>cmin[i-eg[j]]+cg[j]){
					minc=cmin[i-eg[j]]+cg[j];
					mine=emin[i-eg[j]]+eg[j];
					jj=j;}}
			else{
				if(eg[j]>=i&&minc>cg[j]){
					minc=cg[j];
					mine=eg[j];
					jj=j;}}}		
		if(minc!=MAX){
			cmin[i]=minc;
			emin[i]=mine;
			if(i-eg[jj]>0){
				for(int k=1;k<=g;k++){
					if(uz[i-eg[jj]][k])
						uz[i][k]=1;}}
			uz[i][jj]=1;}}}