Cod sursa(job #334309)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 26 iulie 2009 00:53:46
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <stdlib.h>
#define N 1024
#define P 6000
struct generator
{
	int a,b;
};
generator v[N];
int g,w,s,cost[P];
char marc[P],salv[P];
void read()
{
	scanf("%d%d",&g,&w);
	int i;
	for (i=1; i<=g; i++)
	{
		scanf("%d%d",&v[i].a,&v[i].b);
		s+=v[i].a;
	}
}
int compar(const void *p,const void *q)
{
	generator x=*(generator*)p;
	generator y=*(generator*)q;
	if (x.b<y.b)
		return -1;
	if (x.b>y.b)
		return 1;
	if (x.a>y.a)
		return -1;
	if (x.a<y.a)
		return 1;
	return 0;
}
void solve()
{
	int i,j,t;
	marc[0]=1;
	for (i=1; i<=g; i++)
	{
		for (j=0; j<=w; j++)
			salv[j]=marc[j];
		for (j=0; j<w; j++)
			if (marc[j])
			{
				if (j+v[i].a>=w)
					t=w;
				else
					t=j+v[i].a;
				if (marc[t]==0)
				{
					if (salv[t]==0)
					{
						salv[t]=1;
						cost[t]=cost[j]+v[i].b;
					}
					else
						if (cost[j]+v[i].b<cost[t])
							cost[t]=cost[j]+v[i].b;
				}
				else
					if (cost[j]+v[i].b<cost[t])
						cost[t]=cost[j]+v[i].b;
			}
		for (j=0; j<=w; j++)
			marc[j]=salv[j];
	}
	if (marc[w])
		printf("%d\n",cost[w]);
	else
		printf("-1\n");
}
int main()
{
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	read();
	qsort(v+1,g,sizeof(v[0]),compar);
	solve();
	return 0;
}