Cod sursa(job #711812)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 12 martie 2012 19:59:50
Problema Lapte Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <vector>
using namespace std;

int n,L;
int a[105],b[105];
bool dp[105][105][105];
pair<int,int> sol[105][105][105];
pair<int,int> rasp[105];
int timpmin=1<<30;

bool caut(int timp)
{
	dp[0][0][0]=true;
	for(int i=1;i<=n;i++)
		for(int ia=0;ia<=L;ia++)
			for(int ib=0;ib<=L;ib++)
			{
				dp[i][ia][ib]=false;
				for(int t=0;t<=timp;t+=a[i])
				{
					int x,y;
					x=min(ia,t/a[i]);
					y=min((timp-t)/b[i],ib);
					
					if(dp[i-1][ia-x][ib-y]==true)
					{
						dp[i][ia][ib]=true;
						sol[i][ia][ib]=make_pair(x,y);
						break;
					}
				}
			}
	return dp[n][L][L];
}
void rez();
void cautbin()
{
	int li=0,ls=100,mij;
	while(li<=ls)
	{
		mij=(li+ls)/2;
		if(caut(mij)==true)
		{
			ls=mij-1;
			timpmin=mij;
			rez();
		}
		else
			li=mij+1;
	}
	return;
}

void rez()
{
	int ia=L;
	int ib=L;
	for(int i=n;i>=1;i--)
	{
		rasp[i]=sol[i][ia][ib];
		int aux=ia;
		ia-=sol[i][ia][ib].first;
		ib-=sol[i][aux][ib].second;	
	}
	return;
}


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]);
	cautbin();
	printf("%d\n",timpmin);
	for(int i=1;i<=n;i++)
		printf("%d %d\n",rasp[i].first,rasp[i].second);
	return 0;
}