Pagini recente » Rating Georgescu Mihail-Bogdan (mihaiextreme) | Cod sursa (job #2524917) | Cod sursa (job #2418466) | Cod sursa (job #707733) | Cod sursa (job #2647682)
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
int n,l,dp[102][102],costla[102],costlb[102],ant[102][102];
bool sol (int timp)
{
int i,latotal,la,lb;
for (i=0; i<=n; i++)
for (latotal=0; latotal<=l; latotal++)
dp[i][latotal]=-1;
dp[0][0]=0;
for (i=1; i<=n; i++)
for (latotal=0; latotal<=l; latotal++)
if (dp[i-1][latotal]!=-1)
{
for (la=0; la<=min(l,timp/costla[i]); la++)
{
lb=(timp-costla[i]*la)/costlb[i];
dp[i][min(latotal+la,l)]=max(dp[i][min(latotal+la,l)],dp[i-1][latotal]+lb);
}
}
if (dp[n][l]>=l)
return 1;
return 0;
}
void afis(int i,int latotal)
{
if(i>=1)
{
afis(i-1,ant[i][latotal]);
fout<<latotal-ant[i][latotal]<<" "<<dp[i][latotal]-dp[i-1][ant[i][latotal]]<<'\n';
}
}
void reconstituie (int timp)
{
int i,latotal,la,lb;
for (i=0; i<=n; i++)
for (latotal=0; latotal<=l; latotal++)
dp[i][latotal]=-1;
dp[0][0]=0;
for (i=1; i<=n; i++)
for (latotal=0; latotal<=l; latotal++)
if (dp[i-1][latotal]!=-1)
{
for (la=0; la<=min(l,timp/costla[i]); la++)
{
lb=(timp-costla[i]*la)/costlb[i];
if(dp[i][min(latotal+la,l)]<dp[i-1][latotal]+lb)
{
dp[i][min(latotal+la,l)]=dp[i-1][latotal]+lb;
ant[i][min(latotal+la,l)]=latotal;
}
}
}
afis(n,l);
}
int main()
{
fin>>n>>l;
int st=1,dr=100,last=0,i;
for (i=1; i<=n; ++i)
fin>>costla[i]>>costlb[i];
while (st<=dr)
{
int mij=(st+dr)/2;
if (sol (mij))
{
last=mij;
dr=mij-1;
}
else
st=mij+1;
}
fout<<last<<'\n';
reconstituie(last);
return 0;
}