Cod sursa(job #1849880)

Utilizator tudi98Cozma Tudor tudi98 Data 17 ianuarie 2017 22:11:41
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <vector>
using namespace std;

int N,L;
int A[101],B[101];
int dp[101][101];
int pre[101][101];

bool can(int T)
{
    for (int i = 0; i <= 100; i++)
        for (int j = 0; j <= 100; j++)
            dp[i][j] = -1000000000;

    dp[0][0] = 0;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 0; j <= L; j++)
        {
            for (int k = 0; k <= T / A[i] && k <= j; k++)
            {
                if (dp[i][j] < dp[i-1][j-k] + (T - k * A[i]) / B[i])
                {
                    dp[i][j] = dp[i-1][j-k] + (T - k * A[i]) / B[i];
                    pre[i][j] = k;
                }
            }
        }
    }

    if (dp[N][L] >= L) return 1;
    return 0;
}

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

    fin >> N >> L;
    for (int i = 1; i <= N; i++)
        fin >> A[i] >> B[i];

    int l = 1,r = 100;
    while (l != r)
    {
        int mid = (l + r) / 2;
        if (can(mid))
            r = mid;
        else l = mid + 1;
    }

    can(l);

    int T = l;
    vector< pair<int,int> > ans;

    for (int i = N,j = L; i >= 1; j -= pre[i][j], i--)
        ans.push_back(make_pair(pre[i][j],(T - pre[i][j] * A[i]) / B[i]));

    fout << T << "\n";
    for (int i = N; i >= 1; i--)
        fout << ans[i-1].first << " " << ans[i-1].second << "\n";

}