Cod sursa(job #2959349)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 30 decembrie 2022 18:57:17
Problema Lapte Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int ans[105][105];
int nrpers,cantminim;
int a[101],b[101];
int timp_presupus;
int tfinal;
int dp[10001][10001];///primele i persoane beau j litri de lapte a,unde dp[i][j] e cant max lapte b

void find_way_back(int i,int j)
{
    if(i==0)
        return;
    find_way_back(i-1,j-ans[i][j]);
    out<<ans[i][j]<<' '<<(tfinal-a[i]*ans[i][j])/b[i]<<'\n';
};
bool posibil(int t)
{
    for(int i=0; i<=nrpers; i++)
        for(int j=0; j<=cantminim; j++)
        {
            dp[i][j]=-2000000000;
            ans[i][j]=0;
        }
    dp[0][0]=0;
    for(int i=1; i<=nrpers; i++)
        for(int j=0; j<=cantminim; j++)
            for(int a1=0; a1<=j; a1++)
            {
                if(a[i]*a1<=t)
                {
                    if( dp[i][j] < (dp[i-1][j-a1]+((t-a[i]*a1)/b[i])) )
                    {
                        dp[i][j]=(dp[i-1][j-a1]+((t-a[i]*a1)/b[i]));
                        ans[i][j]=a1;
                    }
                }
            }

    if(dp[nrpers][cantminim]>=cantminim)
        return 1;
    return 0;

}
int cb(int st,int dr)
{
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(posibil(mij)==1)
        {
            dr=mij-1;
            tfinal=mij;
        }
        else
            st=mij+1;
    }
    return tfinal;
}
int main()
{
    in>>nrpers>>cantminim;
    for(int i=1; i<=nrpers; i++)
        in>>a[i]>>b[i];

    timp_presupus=10000;
    out<<cb(1,timp_presupus)<<'\n';
    find_way_back(nrpers,cantminim);
    return 0;
}