Cod sursa(job #162363)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 19 martie 2008 22:26:15
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <stdlib.h>

//definitii sortare
#define primul_mai_mic (-1)
#define primul_mai_mare 1
#define egale 0

//definitii dimensiuni
#define G 1001
#define W 5001
#define Infinit 10000000

struct generator
{
	int c, e;
};
generator v[G];
int cost[W] = { Infinit }, g, w;
void citeste()
{
	freopen("energii.in", "r", stdin);
	scanf("%d%d", &g, &w);
	for(int i = 1; i <= g; ++i) scanf("%d%d", &v[i].e, &v[i].c);
	fclose(stdin);
}
int f_cmp(const void *pa, const void *pb)
{
	generator a = (*(generator*)pa), b = (*(generator*)pb);
	if(a.c < b.c) return primul_mai_mic;
	if(a.c > b.c) return primul_mai_mare;
	//a.c == b.c
	if(a.e > b.e) return primul_mai_mic;
	if(a.e < b.e) return primul_mai_mare;
	return egale;
}
void init_cost()
{
	for(int i = 1;i <= W; ++i) cost[i] = Infinit;
}
int main()
{
	citeste();
	qsort(v + 1, g, sizeof(generator), f_cmp);
	init_cost();
	int i, j;
	
	for(i=1;i<=g;++i)
	{
		for(j=1;j<=w;++j)
		{
			if(v[i].e>=j)
			{
				if(cost[j]>v[i].c) cost[j]=v[i].c;
				continue;
			}
			if(cost[j]>cost[j-v[i].e]+v[i].c) cost[j]=cost[j-v[i].e]+v[i].c;			
		}
	}
	
	freopen("energii.out","w",stdout);
	if(cost[w]!=Infinit) printf("%d\n",cost[w]);
	else printf("-1\n");
	fclose(stdout);

	return 0;
}