Cod sursa(job #911622)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 11 martie 2013 19:58:38
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
 
using namespace std;
 
ifstream f("lapte.in");
ofstream g("lapte.out");
 
int a[101],b[101],p=0,q=101,d[101],c[101][101],val[101][101],pot[101][101],i,j,k,n,l,maxim,sol,t,nr,x;;
int main()
{
    f>>n>>l;
    for(i=1;i<=n;i++)
        f>>a[i]>>b[i];
    while(p+1<q)
    {
        t=(p+q)/2;
        for(i=0;i<=100;i++)
            for(j=0;j<=100;j++)
        {
            c[i][j]=0;
            val[i][j]=0;
            pot[i][j]=0;
        }
        for(j=0;j<=t/a[1];j++)
        {
            c[1][j]=(t-a[1]*j)/b[1];
            val[1][j]=j;
            pot[1][j]=1;
 
        }
        for(i=2;i<=n;i++)
        {
            for(j=0;j<=l;j++)
            {
                maxim=-1;
                nr=0;
                for(k=0;k<=j;k++)
 
                   if(a[i]*k<=t)
                   {
                       x=(t-a[i]*k)/b[i];
                       if(c[i-1][j-k]+x>maxim && pot[i-1][j-k]==1)
                       {
                           maxim=c[i-1][j-k]+x;
                           nr=k;
                       }
                   }
                      else break;
                c[i][j]=maxim;
                val[i][j]=nr;
                if(maxim==-1) pot[i][j]=0;
                   else pot[i][j]=1;
                }
            }
            if(c[n][l]>=l)
            {
                sol=t; k=l;
                for(i=n;i>=1;i--)
                {
                    d[i]=val[i][k];
                    k-=val[i][k];
                }
            q=t;
            }
            else p=t;
        }
    g<<sol<<'\n';
    for(i=1;i<=n;i++)
    {
        g<<d[i]<<' ';
        k=(sol-d[i]*a[i])/b[i];
        g<<k<<'\n';
    }
return 0;
f.close();
g.close();
}