Cod sursa(job #1631163)

Utilizator LucianTLucian Trepteanu LucianT Data 5 martie 2016 13:25:28
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define maxN 103
using namespace std;
int t[maxN][2];
int dp[maxN][maxN];
int a[maxN][maxN];
int b[maxN][maxN];
int n, i, j, mij, st, dr, l;
bool verif(int n, int l, int maxT)
{
    //resetez
    memset(dp, -1, sizeof(dp));
    dp[0][0]=0;
    for(i = 1; i <= n; i++)
    {
        int maxx = maxT/t[i][0];
        for(int ind = 0; ind <= maxx; ind++)
        {
            int iau = (maxT-ind*t[i][0])/t[i][1];
            //rucsac
            for(int j = l; j >= ind; j--)
                if(dp[i-1][j-ind] != -1 && dp[i][j] < dp[i-1][j-ind]+iau)
            {
                dp[i][j] = dp[i-1][j-ind]+iau;
                a[i][j] = j-ind;
                b[i][j] = iau;
            }
        }
    }
    return (dp[n][l] >= l);
}
void solutie(int n, int l, int maxT)
{
    if(n)
    {
        solutie(n-1, a[n][l], maxT);
        printf("%d %d\n", (maxT-b[n][l]*t[n][1])/t[n][0], b[n][l]);
    }
}
int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    scanf("%d %d", &n, &l);
    for(i = 1; i <= n; i++)
        scanf("%d %d\n", &t[i][0], &t[i][1]);
    //caut binar solutia
    st=0, dr=maxN;
    while(dr-st-1)
    {
        mij = (st+dr)/2;
        if(verif(n, l, mij))
            dr = mij;
        else st = mij;
    }
    printf("%d\n", dr);
    //refac solutia
    verif(n, l, dr);
    solutie(n, l, dr);
    return 0;
}