Cod sursa(job #91967)

Utilizator 100puncteIonut Popa 100puncte Data 14 octombrie 2007 02:16:55
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>

const int maxg = 1001;
const int maxw = 10001;
const int inf = 1000000000;

int n, w;
int en[maxg];
int cost[maxg];

int st = 0;

void citire()
{
  freopen("energii.in","r",stdin);
  freopen("energii.out","w",stdout);   
  scanf("%d %d", &n, &w);
  for ( int i = 0; i < n; ++i )
        scanf("%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()
{
  citire();

  if ( st < w )
  {
    printf("%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];
  }
  printf("%d\n", s1[w]);
  return 0;
}