Cod sursa(job #71164)

Utilizator alex23alexandru andronache alex23 Data 9 iulie 2007 16:35:28
Problema Energii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>


int i,j,k,g,w,x,y,a[2000],b[2000],min,st[2000],p,s;


void init() {st[k]=-1;}

int Am_Succ()
  { if (st[k]<1)
	  {st[k]++;
	   s+=a[k]*st[k];
	   p+=b[k]*st[k];
	   return 1;
	   }
	else return 0;
  }

int E_Valid()
  {if (p>=min) return 0;
   return 1;
  }

int solutie()
  {if ((k==g)||(s>=w)) return 1;
		  else return 0;
  }

void tipar()
  {if((s>=w) && (p<min)) min=p;}

void back()
  {int as;
   k=1;init();
   while (k>0)
      {do {as=Am_Succ(); } while (as && !E_Valid());
       if (as) if (solutie()) tipar();
			 else {k++;init();}
	else {s=s-a[k]*st[k];
	      p=p-b[k]*st[k];
	      k--;
	      }
      }
  }


int main()
{
FILE *fin,*fout;

fin=fopen("energii.in","r");
fscanf(fin,"%d",&g);
fscanf(fin,"%d",&w);

s=0;
for (i=1;i<=g;i++)
  {fscanf(fin,"%d",&a[i]);
   fscanf(fin,"%d",&b[i]);
   s+=a[i];
   }
fclose(fin);


min=32000;

if (s>=w){ p=s=0; back();}
    //else if (s==w) min=s;
	      else min=-1;

fout=fopen("energii.out","w");
fprintf(fout,"%d",min);
fclose(fout);
return 0;
}