Cod sursa(job #1843710)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 9 ianuarie 2017 09:32:31
Problema Lapte Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
//dp[i][j]-numarul maxim de litri b bauti de primii i participanti daca s-au baut j litri a
#include<bits/stdc++.h>
using namespace std;
int a[105],b[105],dp[105][105],n,l,st,dr,mid,sol,val[105][105];
bool ok(int t)
{
    for(int i=0;i<=100;i++)
    {
        for(int j=0;j<=100;j++)
        {
            dp[i][j]=-10000000;
        }
    }
     dp[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int k=0;k<=l;k++)
            for(int j=0;j<=t/a[i] && j<=k;j++)
                    if (dp[i][k]<dp[i-1][k-j]+(t-j*a[i])/b[i])
                        {
                        val[i][k]=j;
                        dp[i][k]=dp[i-1][k-j]+(t-j*a[i])/b[i];
                        }
    if(dp[n][l]>=l)
    {
        return 1;
    }
    return 0;
}
void ans(int i,int l)
{
    if(i==0) return;
    ans(i-1,l-val[i][l]);
    printf("%d %d\n",val[i][l],(sol-val[i][l]*a[i])/b[i]);
}
bool reconstruieste(int t)
{
    for(int i=0;i<=100;i++)
    {
        for(int j=0;j<=100;j++)
        {
            dp[i][j]=-10000000;
        }
    }
     dp[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int k=0;k<=l;k++)
            for(int j=0;j<=t/a[i] && j<=k;j++)
                    if (dp[i][k]<dp[i-1][k-j]+(t-j*a[i])/b[i])
                        {
                        val[i][k]=j;
                        dp[i][k]=dp[i-1][k-j]+(t-j*a[i])/b[i];
                        }
    ans(n,l);
}
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]);
    }
    for(int i=1;i<=l;i++)
    {
        if(ok(i))
        {
            sol=i;
            break;
        }
    }
    printf("%d\n",sol);
    reconstruieste(sol);
    return 0;
}