Cod sursa(job #2154432)

Utilizator adystar00Bunea Andrei adystar00 Data 6 martie 2018 22:40:48
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
using namespace std;
int n,l,sol;
int d[110][110],best[110][110];
int a[110], b[110];

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

int verif (int t)
{
    int i,j,k;
    for(i=0; i<=n; i++)
        d[i][0]=0;
    for(i=0; i<=n; i++)
        for(j=1; j<=l; j++)
            d[i][j]=-2000000000;
    for(i=1; i<=n; i++)
        for(k=0; k<=t/a[i]; k++)
            for(j=l; j>=k; j--)
            {
                if(d[i][j]<d[i-1][j-k]+(t-k*a[i])/b[i])
                {
                    d[i][j]=d[i-1][j-k]+(t-k*a[i])/b[i];
                    best[i][j]=k;
                }
            }
    if(d[n][l]>=l)
        return 1;
    return 0;
}
void solutie(int k, int liter)
{
    if(k==0)
        return;
    solutie(k-1, liter-best[k][liter]);
    fout<<best[k][liter]<<" "<<(sol-a[k]*best[k][liter])/b[k]<<"\n";
}
int main()
{

    int i,j,mij,l1,l2;

    fin>>n>>l;

    for(i=1; i<=n; i++)
        fin>>a[i]>>b[i];
    l1=1;
    l2=100;
    while(l1<=l2)
    {
        mij=(l1+l2)/2;
        if(verif(mij)==1)
        {
            sol=mij;
            l2=mij-1;
        }
        else
            l1=mij+1;
    }
    fout<<sol<<"\n";
    solutie(n,l);
    return 0;
}