Cod sursa(job #998787)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 17 septembrie 2013 23:39:47
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>

#define maxn 101

using namespace std;

ifstream fin("lapte.in");
ofstream fout ("lapte.out");

int n,l;
int a[maxn],b[maxn];
int v[maxn][maxn],from[maxn][maxn];
int finala[maxn],finalb[maxn];

bool dp (int T)
{
    for (int i=0; i<=n; ++i)
    for (int j=0; j<=l; ++j)
        v[i][j] = -1;

    v[0][0]=0;

    for (int i=1; i<=n; ++i)
    {
        for (int j=0; j<=l; ++j)
        {
            for (int k=0; k<=j; ++k)
            {
                if (k*a[i] > T) continue;

                if (v[i-1][j-k]!=-1 && v[i-1][j-k] + (T-a[i]*k)/b[i] > v[i][j])
                {
                    v[i][j] = v[i-1][j-k] + (T-a[i]*k)/b[i];
                    from[i][j] = k;
                }
            }
        }
    }

    if (v[n][l] < l) return 1;
    return 0;
}

int main()
{
    fin>>n>>l;

    for (int i=1; i<=n; ++i)
    {
        fin>>a[i]>>b[i];
    }

    int lo = -1, hi =maxn;

    while (hi-lo > 1)
    {
        int mid = (lo+hi)/2;

        if (dp(mid)) lo = mid;
        else hi = mid;
    }

    fout<<hi<<"\n";

    for (int i=n, j=l; i>=1; --i)
    {
        finala[i] = from[i][j];
        finalb[i] = (hi - from[i][j]*a[i])/b[i];
        j -= from[i][j];
    }

    for (int i=1; i<=n; ++i)
    {
        fout<<finala[i]<<" "<<finalb[i]<<"\n";
    }

    return 0;
}