Pagini recente » Cod sursa (job #429222) | Cod sursa (job #2544651) | Cod sursa (job #208234) | Cod sursa (job #2716479) | Cod sursa (job #109018)
Cod sursa(job #109018)
#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;
}