Cod sursa(job #2518474)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 5 ianuarie 2020 20:13:03
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("lapte.in");
ofstream g("lapte.out");

int dp[110][110];
pair<int,long long> a[110];
int afis[120][120],l,n;


bool check(int x)
{bool checked=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
        {
            dp[i][j]=-1;
        }

    }
    for(int i=0;i<=min(l,x/a[1].first);i++)
    {
        dp[1][i]=(x-a[1].first*i)/a[1].second;
        afis[1][i]=i;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<=min(l,x/a[i].first);j++)
        {
            for(int d=0;d<=l-j;d++)
            {
                if(dp[i-1][d]>=0&&dp[i-1][d]+(x-a[i].first*j)/a[i].second>dp[i][j+d])
                {
                    dp[i][j+d]=dp[i-1][d]+(x-a[i].first*j)/a[i].second;
                    afis[i][j+d]=j;
                    if(j+d>=l&&dp[i][j+d]>=l)
                       {
                           checked=1;
                       }
                }
            }
        }
    }

    return checked;
}
void drum(int n, int l,int rasp)
{
    if(n>0)
    {
        drum(n-1,l-afis[n][l],rasp);
       g<<afis[n][l]<<" "<<(rasp-afis[n][l]*a[n].first)/a[n].second<<'\n';
    }
}
int main()
{
 f>>n>>l;
 for(int i=1;i<=n;i++)
 {
     f>>a[i].first>>a[i].second;
 }
 int st=1;
 int dr=1000;
 int rasp=0;
 while(st<=dr)
 {
     int mij=(st+dr)/2;
     if(check(mij))
     {
         rasp=mij;
         dr=mij-1;
     }
     else st=mij+1;
 }
g<<rasp<<'\n';
 drum(n,l,rasp);
}