Cod sursa(job #896464)

Utilizator niktudyNica Tudor niktudy Data 27 februarie 2013 15:49:36
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
struct matrice
{
    int val,a,b;
};
matrice m[101][101];
int n,l,a[101],b[101],tok[101],t,x,y,ok,trecut[101],a1[101],b1[101];
void ver ()
{
    int i,j,k,bc;
    trecut[t]=1;
    for (i=0;i<=n;i++)
        for (j=0;j<=l;j++)
            m[i][j].val=-1;
    for (j=0;j<=t/a[1];j++)
        m[1][j].val=(t-j*a[1])/b[1];
    for (i=2;i<=n;i++)
    {
        for (j=0;j<=l;j++)
        {
            for (k=0;k<=j&&k*a[i]<=t;k++)
            {
                if (m[i-1][j-k].val!=-1)
                {
                    bc=(t-k*a[i])/b[i]+m[i-1][j-k].val;
                    if (bc>=m[i][j].val)
                    {
                        m[i][j].val=bc;
                        if (ok==1)
                        {
                            m[i][j].a=k;
                            m[i][j].b=(t-k*a[i])/b[i];
                        }
                    }
                }
            }
        }
    }
    if (m[n][l].val<l)
    {
        tok[t]=1;
        x=t+1;
    }
    else y=t-1;
}
int main()
{
    int i,k,j;
    fin>>n>>l;
    for (i=1;i<=n;i++)
        fin>>a[i]>>b[i];
    x=1;
    y=100;
    tok[0]=1;
    do
    {
        if (tok[t-1]==1&&tok[t]==0) break;
        if (tok[t-1]==1&&tok[t]==1&&trecut[t+1]==1)
        {
            t++;
            break;
        }
        t=(x+y)>>1;
        ver ();
    }
    while (!ok);
    ok=1;
    ver ();
    k=l;
    for (i=n;i>=2;i--)
    {
        b1[i]=m[i][k].b;
        a1[i]=m[i][k].a;
        k-=m[i][k].a;
    }
    b1[i]=m[i][k].val;
    a1[i]=k;
    fout<<t<<'\n';
    for (i=1;i<=n;i++)
        fout<<a1[i]<<' '<<b1[i]<<'\n';
    fin.close ();
    fout.close ();
    return 0;
}