Cod sursa(job #1897403)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 1 martie 2017 13:12:04
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 105;
int N, L, st, dr, mid, t1[Nmax], t2[Nmax], dp[Nmax][Nmax], i, r[Nmax][Nmax];

bool solution(int val)
{
    int i, j, k;

    for(i=0; i<=N; ++i)
        for(j=0; j<=L; ++j)
            dp[i][j] = -20005;
    dp[0][0] = 0;

    for(i=1; i<=N; ++i)
        for(j=0; j<=L && j*t1[i]<=val; ++j)
            for(k=0; j+k<=L; ++k)
            {
                int nr = dp[i-1][k]+(val-j*t1[i])/t2[i];
                if(dp[i][k+j] < nr)
                    dp[i][k+j] = nr, r[i][k+j] = j;
            }

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

void print_solution(int n, int k)
{
    printf("%d %d\n", r[n][k], (st-t1[n]*r[n][k]) / t2[n]);
    if(n-1) print_solution(n-1, k-r[n][k]);
}

int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);

    scanf("%d%d", &N, &L);

    for(i=N; i; --i)
        scanf("%d%d", &t1[i], &t2[i]);

    st = 1; dr = 20000;
    while(st<=dr)
    {
        mid = (st+dr)/2;
        if(solution(mid)) dr = mid-1;
        else st = mid+1;
    }

    printf("%d\n", st);

    solution(st);
    print_solution(N, L);

    return 0;
}