Cod sursa(job #1831769)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 18 decembrie 2016 18:20:16
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<bits/stdc++.h>
using namespace std;
int a[105],b[105],dp[105][10005],n,l,st,dr,mid,sol;
bool ok(int timp)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=(n*timp);j++) dp[i][j]=0;
    }
    for(int i=0;i<=timp;i+=a[1]) dp[1][i/a[1]]=(timp-i)/b[1];
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<=timp;j+=a[i])
            for(int k=0;k<=(n*timp);k++)
                dp[i][j/a[i]+k]=max(dp[i][j/a[i]+k],dp[i-1][k]+(timp-j)/b[i]);
    }
    for(int i=l;i<=(n*timp);i++)
    {
        if(dp[n][i]>=l) return 1;
    }
    return 0;
}
void reconstruieste(int t,int i,int lc) {
    if (i!=1)
    {
        reconstruieste(t,i-1,lc-dp[i][lc]);
    }
    printf("%d %d\n",dp[i][lc],(t-dp[i][lc]*a[i])/b[i]);
}
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]);
    }
    st=1;
    dr=10000;
    while(st<=dr)
    {
        int mid=(st+dr)>>1;
        if(ok(mid))
        {
            sol=mid;
            dr=mid-1;
        }
            else st=mid+1;
    }
    printf("%d\n",sol);
    reconstruieste(sol,n,l);
    return 0;
}