Cod sursa(job #1553700)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 20 decembrie 2015 13:14:48
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <cstring>
#include <utility>

#define pii pair< int,int >
#define st first
#define nd second

using namespace std;

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

const int MX = 102;

int N,L,Sol;
pii A[MX],B[MX];
int dp[MX][MX],nxt[MX][MX];

bool check(int X)
{
    memset(dp,-1,sizeof(dp));
    memset(nxt,0,sizeof(nxt));

    dp[0][0] = 0;

    for (int i = 1;i <= N;i++)
        for (int j = 0;j <= L;j++)
        {
            if (dp[i - 1][j] == -1)
               continue;

            for (int k = 0;k <= X / A[i].st && j + k <= L;k++)
                if (dp[i][j + k] < dp[i - 1][j] + (X - A[i].st * k) / A[i].nd)
                {
                    dp[i][j + k] = dp[i - 1][j] + (X - A[i].st * k) / A[i].nd;
                    nxt[i][j + k] = k;
                }
        }

    return dp[N][L] >= L;
}

int main()
{
    fin >> N >> L;

    for (int i = 1;i <= N;i++)
        fin >> A[i].st >> A[i].nd;

    for (int left = 1,right = MX;left <= right;)
    {
        int middle = (left + right) / 2;

        if (check(middle))
        {
            Sol = middle;
            right = middle - 1;
        }
       else
            left = middle + 1;
    }

    check(Sol);

    /**for (int i = 1;i <= N;i++)
    {
        for (int j = 0;j <= L;j++)
            fout << dp[i][j] << " ";

        fout << endl;
    }

    for (int i = 1;i <= N;i++)
    {
        for (int j = 0;j <= L;j++)
            fout << nxt[i][j] << " ";

        fout << endl;
    }*/

    for (int i = N;i;i--)
    {
        B[i].st = nxt[i][L];
        B[i].nd = (Sol - A[i].st * B[i].st) / A[i].nd;
        L -= nxt[i][L];
    }

    fout << Sol << "\n";

    for (int i = 1;i <= N;i++)
        fout << B[i].st << " " << B[i].nd << "\n";

  return 0;
}