Cod sursa(job #551712)

Utilizator palcuiealexAlex Palcuie palcuiealex Data 11 martie 2011 00:24:22
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
//Problem: energii
//EIUCLAP

#include <cstdio>
#include <algorithm>
#include <bitset>

using namespace std;

//const
const int NMAX=5001;
const int WMAX=1001;

//global vars
int n;

//objects
short e[WMAX],c[WMAX];
int sol[WMAX];
bool b[NMAX][WMAX];

//function def
inline void debug(int);
inline void debug(int *);

//function body
inline void debug(const int x){
	fprintf(stderr,"%d\n",x);
}

inline void debug(const int *v){
	for(int i=0;i<n;++i)
		fprintf(stderr,"%d ",v[i]);
	fprintf(stderr,"\n");
}

int main(){
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	
	//vars
	int emin;
	int i,j,k;//loop
	
	//read
	scanf("%d%d",&n,&emin);
	for(i=0;i<n;++i)
		scanf("%d%d",&e[i],&c[i]);
	
	//body
	fill_n(sol,sol+n,10001);
	sol[0]=0;
	for(i=1;i<=emin;++i)
		for(j=0;j<n;++j){
			if(i-e[j]<0 && c[j]<sol[i]){
				sol[i]=c[j];
				b[i][j]=true;
			}			
			else if (c[j]+sol[i-e[j]]<sol[i] && !b[i-e[j]][j]){
				sol[i]=c[j]+sol[i-e[j]];
				for(k=0;k<n;++k)
					b[i][k]=b[i-e[j]][k];
				b[i][j]=true;
			}
		}
	if(sol[emin]==10001)
		printf("-1\n");
	else
		printf("%d\n",sol[emin]);
	return 0;
}