Mai intai trebuie sa te autentifici.
Cod sursa(job #88011)
Utilizator | Data | 29 septembrie 2007 23:07:55 | |
---|---|---|---|
Problema | Energii | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.16 kb |
#include <cstdio>
const int maxg = 1001;
const int maxw = 10001;
const int inf = 1000000000;
FILE *in = fopen("energii.in","r"), *out = fopen("energii.out","w");
int n, w;
int en[maxg];
int cost[maxg];
int st = 0;
void read()
{
fscanf(in, "%d %d", &n, &w);
for ( int i = 0; i < n; ++i )
fscanf(in, "%d %d", &en[i], &cost[i]), st += en[i];
}
int V[maxw];
int s1[maxw];
int s2[maxw];
inline int min(int x, int y)
{
return x < y ? x : y;
}
int main()
{
read();
if ( st < w )
{
fprintf(out, "%d\n", -1);
return 0;
}
for ( int j = 0; j < n; ++j )
{
for ( int i = w; i; --i )
{
int eng = i - en[j];
if ( eng <= 0 )
{
if ( j == 0 ) s1[i] = cost[j];
else s1[i] = min(s2[i], cost[j]);
}
else
{
if ( j == 0 ) s1[i] = inf;
else s1[i] = min(s2[i], cost[j] + s2[eng]);
}
}
for ( int j = 0; j <= w; ++j )
s2[j] = s1[j];
}
fprintf(out, "%d\n", s1[w]);
return 0;
}