Cod sursa(job #88038)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 29 septembrie 2007 23:27:21
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
  int e, c;
} generator;

generator v[1060], b[1060];

long e[6000], c[6000], n, x, suma;

int cmp(const void*a, const void*b)
{
  int x=*(int*)a, y=*(int*)b;
  if(v[x].c==v[y].c) return v[x].e-v[y].e;
    else return v[x].c-v[y].c;
}

int main()
{
  freopen("energii.in","r",stdin);
  freopen("energii.out","w",stdout);

  scanf("%ld%ld",&n,&x);
  int i, j, min, ord[1009];
  for (i=1; i<=n; i++)
  {
    scanf("%d %d",&v[i].e,&v[i].c);
    suma+=v[i].e;
    ord[i]=i;
  }
  if (suma<x){ printf("-1"); return 0;}

  qsort(ord,n+1,sizeof(int),cmp);
  for (i=1; i<=n; ++i) b[i]=v[ord[i]];

  e[0]=1;
  min=100000;

  for(i=1; i<=n; i++)
    for (j=x-b[i]; j>=0; j--)
      if (e[j]==1)
       {
	 e[j+b[i].e]=1;
	 if (c[j+b[i].e]==0) c[j+b[i].e]+=(b[i].c+c[j]);
	    else c[j+b[i].c]=b[i].c+c[j];
	 if ((j+b[i].e)>=x-1 && c[j+b[i].e]<min) min=c[j+b[i].e];

       }

  printf("%d",min);
  return 0;
}