Cod sursa(job #809138)

Utilizator Robert29FMI Tilica Robert Robert29 Data 7 noiembrie 2012 22:10:45
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
FILE*f=fopen("lapte.in","r");
FILE*g=fopen("lapte.out","w");
int n,l,m,a[105][105];
struct lapte
{
	int a,b;
}v[102];
struct rucsac
{
	int a,b;
}sol[103][102],sol1[103][102],sol2[103];
int main()
{
	fscanf(f,"%d%d",&n,&l);
	for(int i=1;i<=n;++i)
		fscanf(f,"%d%d",&v[i].a,&v[i].b);
	
	int p=1;
	int u=100;

	while(p<=u)
	{
		m=(p+u)/2;
		
		for(int i=0;i<=n;++i)
			for(int j=0;j<=l;++j)
				a[i][j]=-1;
		a[0][0]=0;
		for(int i=1;i<=n;++i)
			for(int j=0;j<=l;++j)
				for(int t=0;t<=m/v[i].a&&t<=j;++t)
					if(a[i-1][j-t]>=0)
					{
						int x=m-t*v[i].a;
						int y=x/v[i].b;
						if(a[i][j]<a[i-1][j-t]+y)
						{
							a[i][j]=a[i-1][j-t]+y;
							sol[i][j].a=t;
							sol[i][j].b=y;
						}
					}
		
		if(a[n][l]>=l)
		{
			u=m-1;
			for(int i=0;i<=n;++i)
				for(int j=0;j<=l;++j)
					sol1[i][j]=sol[i][j];
		}
		else
			p=m+1;
	
	}
	
	fprintf(g,"%d\n",p);
	int y=l;
	for(int i=n;i;--i)
	{
		sol2[i].a=sol1[i][l].a;
		sol2[i].b=sol1[i][l].b;
		l-=sol1[i][l].a;
	}
	
	for(int i=1;i<=n;++i)
		fprintf(g,"%d %d\n",sol2[i].a,sol2[i].b);
	
	fclose(f);
	fclose(g);
	return 0;
}