Cod sursa(job #592832)

Utilizator tiganu_dolarMancea Catalin tiganu_dolar Data 30 mai 2011 20:57:38
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>
#include<string.h>
#include<set>
using namespace std;

#define pi pair<int,int>
#define x first
#define y second
#define NMAX 105
#define INF 1000000005

int d[NMAX][NMAX],L,n,sol;
int pred[NMAX][NMAX],predc[NMAX][NMAX];
pi v[NMAX];

int merge(int timp)
{
	if(timp<0)
		return 0;
	int i,j,k,lb;
	
	memset(d,0,sizeof(d));
	for(j=0;j<=n;j++)
		for(i=0;i<=L;i++)
			d[j][i]=-INF;
	d[0][0]=0;		
	for(i=1;i<=n;i++)
		for(j=0;j<=L;j++)
			for(k=0;k<=j && k*v[i].x<=timp;k++)
			{
				lb=(timp-k*v[i].x)/v[i].y;
				if(d[i][j]<d[i-1][j-k]+lb)
				{
					d[i][j]=d[i-1][j-k]+lb;
					predc[i][j]=k;
				}
			}
	/*for(i=1;i<=n;i++)
		for(j=0;j<=L;j++)
			printf("Pentru %d si %d am: %d\n",i,j,d[i][j]);	*/
	return d[n][L]>=L;		
}

void recur(int poz,int cant)
{
	if(!poz)
		return ;
	recur(poz-1,cant-pred[poz][cant]);	
	printf("%d %d\n",pred[poz][cant],(sol-v[poz].x*pred[poz][cant])/v[poz].y);
}

int main ()
{
	int i,j,st,dr,mij;
	
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d%d",&n,&L);
	for(i=1;i<=n;i++)
		scanf("%d%d",&v[i].x,&v[i].y);
	st=1;dr=200000;
	while(st<=dr)
	{
		mij=(st+dr)/2;
		if(merge(mij))
		{
			sol=mij;
			dr=mij-1;
			for(i=1;i<=n;i++)
				for(j=1;j<=L;j++)
					pred[i][j]=predc[i][j];
		}	
		else
			st=mij+1;
	}	
	printf("%d\n",sol);		
	recur(n,L);
	return 0;
}