Cod sursa(job #301725)

Utilizator mottyMatei-Dan Epure motty Data 8 aprilie 2009 13:33:12
Problema Energii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<stdio.h>
#define N 20001
#define G 5001
#define INF 100000001
#define min(a,b) a<b ? a:b
int n,r,pmax,a1[N],a2[N];
struct gen{
	int w,p;
};
gen g[G];

void cit()
{
	scanf("%d%d",&n,&r);
	for( int i=0 ; i<n ; ++i )
	{
		scanf("%d%d",&g[i].w,&g[i].p);
		pmax+=g[i].w;
	}
	for( int i=0 ; i<N ; ++i )
		a1[i]=a2[i]=INF;
}

void calc()
{
	a2[g[0].w]=g[0].p;
	a1[g[0].w]=g[0].p;
	
	for( int i=1 ; i<n ; ++i )
	{
		a2[g[i].w]=g[i].p;
		for( int j=0 ; j<=pmax ; ++j )
			if(a1[j]!=INF)
				a2[ j + g[i].w ] = min( a1[j] + g[i].p , a2[ j + g[i].w ] ) ;
		for( int j=0 ; j<=pmax ; ++j )
			a1[j]=a2[j];
	}
	int cost=INF;
	for( int i=r ; i<=pmax ; ++i )
		cost=min( a1[i] , cost );
	printf("%d\n",cost);
}

int main()
{
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	cit();
	if(pmax<r)
	{
		printf("-1\n");
		return 0;
	}
	calc();
	return 0;
}