Cod sursa(job #1141983)

Utilizator PatrikStepan Patrik Patrik Data 13 martie 2014 12:58:09
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    #define MAX 101
    int N , L , sol , d[MAX][MAX] , a[MAX]  , b[MAX] , c[MAX][MAX]  , cant[MAX];
    bool u[MAX][MAX];

    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]);
        int ls = 1 , ld = 100 , t ;
        while(ls <= ld )
        {
            memset(d,0,sizeof(d));
            memset(u,0,sizeof(u));
            memset(c,0,sizeof(c));
            t = (ls+ld)/2;
            for(int i = 1 ; i <= min(L,t/a[1]) ; ++i)
                d[1][i] = (t-i*a[1])/b[1],u[1][i] = 1,c[1][i] = i;
            for(int i = 2 ; i <= N ; ++i )
                for(int j = 0 ; j <= L ; ++j )
                {
                    d[i][j] = -1;
                    for(int k = 0 ; k <= j && t-k*a[i] >= 0; ++k )
                        if((t-a[i]*k)/b[i] + d[i-1][j-k]  > d[i][j] && u[i-1][j-k])
                        {
                            d[i][j] = (t-a[i]*k)/b[i] + d[i-1][j-k];
                            c[i][j] = k;
                        }
                    if(d[i][j] > 0)u[i][j] = 1;
                }
            if(d[N][L] >= L)
            {
                sol = t;
                ld = t-1;
                int s = L;
                for(int i = N ; i ; i--)
                {
                    cant[i] = c[i][s];
                    s -= c[i][s];
                }
            }
            else ls = t+1;
        }
        printf("%d\n" , sol );
        for(int i = 1 ; i <= N ; ++i )
            printf("%d %d\n" , cant[i] , (sol-cant[i]*a[i])/b[i]);
        return 0;
    }