Cod sursa(job #596532)

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

int g, w, eg[1001], cg[1001], cmin[5001], emin[5001],min=10001;
bool uz[5001][1001];

void citire();
void calcul();


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

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

void calcul(){
	int mine,jj,j,k;
	long minc;
	for(int i=1;i<=w;i+=min){
		minc=MAX;
		for(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(k=1;k<=g;k++){
					if(uz[i-eg[jj]][k])
						uz[i][k]=1;}}
			uz[i][jj]=1;}
		for(j=i+1;j<=i+min-1;j++){
			cmin[j]=cmin[i];
			emin[j]=emin[i];
			for(k=1;k<=g;k++)
				uz[j][k]=uz[i][k];}}}