Cod sursa(job #578382)

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

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;
	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));
		
		for (i = 1; i <= n; i ++)
			for (j = 0; j + a[i].x <= w * 2; 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 <= w * 2; j ++)
			if (d[j] < min && d[j] != 0)
				min = d[j];
		
		printf("%ld\n", min);
	
	return 0;
}