Cod sursa(job #1492467)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 27 septembrie 2015 19:55:48
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>

#define NMAX 107
#define inf -2000000007

using namespace std;
int n, l, A[NMAX], B[NMAX], ans, d[NMAX][NMAX], dp[NMAX][NMAX];
int verific(int val)
{
    int minim, valB;
    for(int i = 0; i<= n; ++i)
    {
        for(int j = 0; j<= l; ++j)
        {
            d[i][j] = inf;
            dp[i][j] = 0;
        }
    }
    d[0][0] = 0;
    for(int i = 0; i< n; ++i)
    {
        for(int j = 0; j<= l; ++j)
        {
            if(d[i][j] == inf) continue;
            for(int valA = 0; valA<= l-j; ++valA)
            {
                minim = A[i+1]*valA;
                if(minim > val) break;
                valB = (val - minim)/B[i+1];
                if(d[i+1][j+valA] >= d[i][j] + valB) continue;
                d[i+1][j+valA] = d[i][j] + valB;
                dp[i+1][j+valA] = j;
            }
        }
    }
    if(d[n][l] >= l) return 1;
    return 0;
}
int cautbin()
{
    int start = 0, fin = 100, step = 1<<10, index;
    for(;step;step>>=1)
    {
        index = start + step;
        if(index <= fin)
        {
            if(!verific(index))
            {
                start = index;
            }
        }
    }
    return start;
}
void afisare(int x, int y)
{
    if(!x) return;
    int valA, valB;
    valA = y - dp[x][y];
    valB = (ans - valA*A[x])/B[x];
    afisare(x-1, y - valA);
    printf("%d %d\n", valA, valB);
}
int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    scanf("%d %d", &n, &l);
    for(int i = 1; i<= n; ++i) scanf("%d %d", &A[i], &B[i]);
    ans = cautbin()+1;
    printf("%d\n", ans);
    verific(ans);
    afisare(n, l);
    return 0;
}