Cod sursa(job #109018)

Utilizator tvladTataranu Vlad tvlad Data 24 noiembrie 2007 14:57:01
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include <cstring>

const int N = 1000;
const int W = 5000;
const int INF = 0x3f3f3f3f;

int n,w;
int e[N+1], c[N+1], d[W+1], m[W+1];

inline int min ( int a, int b ) { return (a < b) ? a : b; }

int main() {
	freopen("energii.in","rt",stdin);
	freopen("energii.out","wt",stdout);
	scanf("%d",&n);
	scanf("%d",&w);
	int s = 0;
	for (int i = 1; i<=n; ++i) {
		scanf("%d %d",&e[i],&c[i]);
		if (e[i] > w) e[i] = w;
		s += e[i];
	}
	if (s < w) {
		printf("-1\n");
		return 0;
	}
	memset(m,0x3f3f,sizeof(m));
	m[0] = 0;
	for (int i = 1; i <= n; ++i) {
		int j;
		for (j = 0; j < e[i]; ++j) d[j] = INF;
		for (; j <= w; ++j) d[j] = (m[j-e[i]] == INF) ? INF : m[j-e[i]] + c[i];
		for (j = w-e[i]+1; j <= w; ++j) d[w] = min(d[w], ((m[j] == INF) ? INF : m[j]+c[i]));
		int mm = INF;
		for (j = w; j >= 0; --j) {
			if (m[j] > d[j]) m[j] = d[j];
			if (mm > m[j])
				mm = m[j]; else
				m[j] = mm;
		}
	}
	printf("%d\n",m[w]);
	return 0;
}