Cod sursa(job #2394622)

Utilizator robertrRotaru Stefan Robert robertr Data 1 aprilie 2019 18:58:36
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
using namespace std;

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

int st, dr, a[103][103], dp[103][103], n, L;

struct timpi{
                int a, b;
            }v[103];

void afis(int n, int L)
{
    if(n)
    {
        afis(n-1, L-a[n][L]);
        fout<<a[n][L]<<" "<<(sol-a[n][L]*v[n].a)/v[n].b<<"\n";
    }
}

bool sepoate(int t)
{
    for(int i=1;i<=n;++i)
        for(int j=1;j<=L;++j) dp[i][j]=-1;
    for(int j=0;j<=min(t/v[1].a, L);++j) dp[1][j]=(t-j*v[1].a)/v[1].b, a[1][j]=j;
    for(int i=2;i<=n;++i)
        for(int j=0;j<=min(t/v[i].a, L);++j)
            for(int k=j;k<=L;++k)
            {
                if(dp[i-1][k-j]!=-1)
                    if(dp[i][k]<dp[i-1][k-j]+(t-j*v[i].a)/v[i].b)
                    {
                        dp[i][k]=dp[i-1][k-j]+(t-j*v[i].a)/v[i].b;
                        a[i][k]=j;
                    }
            }
    if(dp[n][L]>=L)
        return 1;
    return 0;
}

int main()
{
    fin>>n>>L;
    for(int i=1;i<=n;++i) fin>>v[i].a>>v[i].b;
    st=1, dr=L*v[1].a+L*v[1].b;
    while(st<dr)
    {
        int m=(st+dr)/2;
        if(sepoate(m)) dr=m-1,sol=m;
        else st=m+1;
    }
    sepoate(sol);
    fout<<sol<<"\n";
    afis(n, L);
    return 0;
}