Cod sursa(job #2421920)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 16 mai 2019 18:16:36
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,q;

int va[111],vb[111];

int dp[111][111];
int pr[111][111];

bool check(int time)
{
    for (int i=0; i<=n; i++)
    {
        for (int j=0; j<=q; j++)
        {
            dp[i][j]=-1;
        }
    }
    dp[0][0]=0;
    for (int i=1; i<=n; i++)
    {
        for (int j=0; j<=q; j++)
        {
            for (int k=0; k<=min(j,time/va[i]); k++)
                if (dp[i-1][j-k] !=-1 && dp[i-1][j-k]+(time-k*va[i])/ vb[i]>dp[i][j])
                {
                    dp[i][j]=dp[i-1][j-k]+(time-k*va[i])/vb[i];
                    pr[i][j]= k;
                }
        }
    }
    return dp[n][q]>=q;
}

void solve(int i,int j,int time)
{
    if (i>1)
    {
        solve(i-1,j-pr[i][j],time);
    }
    fout<<pr[i][j]<<' '<<(time-pr[i][j]*va[i])/vb[i]<<"\n";
}

int main()
{
    fin>>n>>q;
    for (int i=1; i<=n; i++)
    {
        fin>>va[i]>>vb[i];
    }
    int st=0,dr=101;
    while (st<dr)
    {
        int mij=(st+dr)/2;
        if (check(mij))
        {
            dr=mij;
        }
        else
        {
            st=mij;
        }
    }
    fout<<dr<<"\n";
    check(dr);
    solve(n,q,dr);
    return 0;
}