Cod sursa(job #88000)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 29 septembrie 2007 22:57:43
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
  int e, c;
} generator;

generator v[1005], b[1005];

int e[300000], c[300000], n, x, suma;

int cmp(const void*a, const void*b)
{
  long int x=*(long int*)a, y=*(long 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("%d%d",&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;
  int  max=1;
  min=10000;

  for(i=1; i<=n; i++)
    for (j=w; 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]);
	// if (j+b[i].e>=max) max=j+b[i].e;
	 if (j+b[i].e>x && c[j+b[i].e]<min) min=c[j+b[i].e];

       }

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