Cod sursa(job #593441)

Utilizator SpiderManSimoiu Robert SpiderMan Data 2 iunie 2011 20:30:33
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
# include <cstdio>
# include <cstring>

const char *FIN = "lapte.in", *FOU = "lapte.out" ;
const int MAX = 105 ;

struct vec {
    int a, b ;
} V[MAX] ;

int dp[MAX][MAX], rec[MAX][MAX] ;
int N, L ;

bool check (int X) {
    memset (dp, -1, sizeof (dp)) ;

    dp[0][0] = 0;
    for (int i = 1; i <= N; ++i) {
        for (int j = 0; j <= L; ++j) {
            for (int k = 0; k <= X / V[i].b && k <= j; ++k) {
                if (dp[i - 1][j - k] != -1 && dp[i][j] < dp[i - 1][j - k] + (X - V[i].b * k) / V[i].a) {
                    dp[i][j] = dp[i - 1][j - k] + (X - V[i].b * k) / V[i].a ;
                    rec[i][j] = j - k;
                }
            }
        }
    }
    return (dp[N][L] < L ? 0 : 1) ;
}

void tipar (int i, int j) {
    if (i > 0) {
        tipar (i - 1, rec[i][j]) ;
        printf ("%d %d\n", dp[i][j] - dp[i - 1][rec[i][j]], j - rec[i][j]) ;
    }
}

int main (void) {
    freopen (FIN, "r", stdin) ;

    scanf ("%d %d", &N, &L) ;
    for (int i = 1; i <= N; ++i)
        scanf ("%d %d", &V[i].a, &V[i].b) ;
    int cnt, i ;
    for (cnt = 1; cnt << 1 <= 100000; cnt <<= 1);
    for (i = cnt + 1; cnt; cnt >>= 1)
        if (i - cnt > 0 && check (i - cnt))
            i -= cnt ;

    freopen (FOU, "w", stdout) ;
    printf ("%d\n", i) ;
    check (i) ;
    tipar (N, L) ;
}