Cod sursa(job #69434)

Utilizator crawlerPuni Andrei Paul crawler Data 3 iulie 2007 00:07:51
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <string>

using namespace std;

#define Nmax 101
int a[Nmax], b[Nmax], n,l;
#define int short
int best[Nmax*2];
int use1[Nmax], use2[Nmax], use[Nmax][Nmax*2];

int good(int T)
{
	memset(use,0,sizeof(use));
	memset(best,-1,4*Nmax);	
	best[0] = 0;

       	#define comp(A,B) if (A<B) A = (B), use[i][j+k] = j;
       	// aka am baut j litri de A, si .. B
       
   	for (int i=n;i>=0;--i)
  	   for (int k=2*l;k>=0;--k) if (best[k] >= 0)
	      for(int j=T/a[i];j>=0;--j) if (j + k <= 2*l)
		   comp(best[j+k],((T-a[i]*j)/b[i])+best[k])

	for (int i=2*l;i>=l;--i)
		if(best[i] >= l)
			return i;
	return 0;	
}	

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

	scanf("%d%d",&n,&l);

	for (int i=1;i<=n;++i)
		scanf("%d%d",a+i,b+i);
		
	int rec,ret=0;
	
	#define pow(w) (1<<(w))
	#define Q(i) rec = good(ret + pow(i)); if (rec == 0) ret += pow(i);
	Q(6) Q(5) Q(4) Q(3) Q(2) Q(1) Q(0)

    --ret;
	do { rec = good(++ret); } while(rec == 0);
	printf("%d\n",ret);

	for (int i=1;i<=n;++i)
    {
	    printf("%d %d\n",use[i][rec],(ret-use[i][rec]*a[i])/b[i]);
		rec -= use[i][rec];	
	}
	
		
	return 0;
}