Cod sursa(job #1954547)

Utilizator danstefanDamian Dan Stefan danstefan Data 5 aprilie 2017 14:55:42
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;
ofstream g ("lapte.out");
int dp[110][110],n,l,i,in,sf,mid,ans[110][110],j,k,nr;
pair<int,int>v[110];
void sol(int N,int L)
{
    g<<ans[N][L]<<" "<<(mid-v[N].first*ans[N][L])/v[N].second<<'\n';
    if(N-1)sol(N-1, L-ans[N][L]);
}
int main()
{
    ifstream f ("lapte.in");
    f>>n>>l;
    for(i=n; i>=1; --i)
        f>>v[i].first>>v[i].second;
    in=1;
    sf=100;
    while(in<=sf)
    {
        mid=(in+sf)/2;
        memset(dp,-20010,sizeof(dp));
        dp[0][0]=0;
        for(i=1; i<=n; ++i)
            for(j=0; j<=l&&j<=mid/v[i].first; ++j)
                for(k=0; k<=l-j; ++k)
                {
                    nr=dp[i-1][k]+(mid-j*v[i].first)/v[i].second;
                    if(dp[i][k+j]<nr)
                    {
                        dp[i][k+j]=nr;
                        ans[i][k+j]=j;
                    }
                }
        if(dp[n][l]>=l)sf=mid-1;
        else in=mid+1;
    }
    g<<in<<'\n';
    mid=in;
    memset(dp,-20010,sizeof(dp));
    dp[0][0]=0;
    for(i=1; i<=n; ++i)
        for(j=0; j<=l&&j<=mid/v[i].first; ++j)
            for(k=0; k<=l-j; ++k)
            {
                nr=dp[i-1][k]+(mid-j*v[i].first)/v[i].second;
                if(dp[i][k+j]<nr)
                {
                    dp[i][k+j]=nr;
                    ans[i][k+j]=j;
                }
            }
    sol(n,l);
    return 0;
}