Cod sursa(job #1169450)

Utilizator tudorv96Tudor Varan tudorv96 Data 11 aprilie 2014 13:00:42
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstring>
#include <fstream>
using namespace std;

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

const int N = 105;

int n, L, A[N], B[N], knap[N][N], rknap[N][N], t[N][N], rt[N][N];

bool go(int x) {
    memset (knap, -1, sizeof(knap));
    knap[0][0] = 0;
    for (int i = 1; i <= n; ++i)
        for (int j = 0; j <= L; ++j)
            for (int k = 0; k <= L / B[i] && k <= j; ++k)
                if (knap[i-1][j-k] != -1 && knap[i-1][j-k] + (x - k * B[i]) / A[i] > knap[i][j]) {
                    knap[i][j] = knap[i-1][j-k] + (x - k * B[i]) / A[i];
                    t[i][j] = j - k;
                }
    if (knap[n][L] >= L) {
        memcpy (rknap, knap, sizeof(knap));
        memcpy (rt, t, sizeof(t));
        return 1;
    }
    return 0;
}

void write(int i, int j) {
    if (!i)
        return;
    write (i-1, rt[i][j]);
    fout << rknap[i][j] - rknap[i-1][rt[i][j]] << " " << j - rt[i][j] << "\n";
}

int main() {
    fin >> n >> L;
    for (int i = 1; i <= n; ++i)
        fin >> A[i] >> B[i];
    int sol = 1 << 22;
    for (int step = 1 << 22; step; step >>= 1)
        if (go (sol - step))
            sol -= step;
    fout << sol << "\n";
    write (n, L);
}