Cod sursa(job #1631151)

Utilizator LucianTLucian Trepteanu LucianT Data 5 martie 2016 13:21:47
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 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 afisare(int n, int l, int &maxT)
{
    int i;
    for(i = n; i >= 1; i--)
        printf("%d %d\n", (maxT-b[i][l]*t[i][1])/t[i][0], b[i][l]), l=a[i][l];
}
void afisarerec(int n,int l,int &maxT)
{
    if(n!=0)
    {
        afisarerec(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);
    afisarerec(n, l, dr);
    return 0;
}