Cod sursa(job #11371)

Utilizator lucibitLucian Onea lucibit Data 31 ianuarie 2007 15:11:21
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<stdio.h>
#define maxN 1001
#define maxW 5001
int W,N,E[maxN],C[maxN],c[2][maxW],ok,n,MIN,emin2;

void citire()
{freopen("energii.in","r",stdin);
 scanf("%d\n%d\n",&N,&W);
 int cmin=0; ok=0; MIN=10400;
 int x,y;
 emin2=n=0;
 for(int i=1;i<=N;i++)
 {scanf("%d %d\n",&x,&y);
  if (x>=W && y<MIN) MIN=y;
	 else if(x<W) {E[++n]= x;  emin2+=x;C[n]=y;}
  cmin+=x;
  }
 if(cmin>=W) ok=1;
 }
int main ()
{citire();
freopen("energii.out","w",stdout);
 int i,j;

for(i=1;i<=W;i++) c[0][i]=C[1];


	for(i=2;i<=n;i++)
	 for(j=1;j<=W;j++)
	  {c[(i+1)%2][j]=c[i%2][j];
		if(E[i]<=j) if(c[i%2][j-E[i]]+C[i]<c[(i+1)%2][j])c[(i+1)%2][j]=c[i%2][j-E[i]]+C[i];
		}

if (emin2>=W && ok) {if (c[n][W]<MIN) printf("%d\n",c[n][W]);
						 else printf("%d\n",MIN); }
	 else if(emin2<W && ok) printf("%d\n",MIN);
	  else printf("-1\n");
	  return 0;}