Cod sursa(job #578418)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 11 aprilie 2011 11:51:40
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct pct{long x; long y;} a[10001];
long n, w, b[200001], x, d[200001], i, j, min = 99999999;

int compare(const void *a, const void *b)
{
	pct x = *(pct*)a;
	pct y = *(pct*)b;
	if (x.y < y.y) return -1;
	else if (x.y > y.y) return 1;
	if (x.x < y.x) return -1;
	else if (x.x > y.x) return -1;
	return 0;
}

int main()
{
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	
		scanf("%ld", &n);
		scanf("%ld", &w);
		
		for (i = 1; i <= n; i ++)
			scanf("%ld %ld", &a[i].x, &a[i].y);
		
		qsort(a, n, sizeof(pct), compare);
		
		memset(b + 1, -1, sizeof(b));
		memset(d + 1, -1, sizeof(d));
		
		for (i = 1; i <= n; i ++)
			for (j = 0; j + a[i].x <= 20001; j ++)
				if (b[j] < i && b[j + a[i].x] == -1 && b[j] != -1)
				{
					b[j + a[i].x] = i;
					d[j + a[i].x] = d[j] + a[i].y;
				}
			//	else if (b[j] < i && d[j + a[i].x] > d[b[j]] + a[i].y)
			//	{
			//		d[j + a[i].x] = d[b[j]] + a[i].y;
			//	}
		
		j = w;
		for (j = w; j <= 100001; j ++)
			if (d[j] < min && d[j] != -1)
				{min = d[j];x = j;}
		if (min == 99999999) printf("-1\n");
		else printf("%ld %ld\n", min, x);
	
	return 0;
}