Pagini recente » Cod sursa (job #2877660) | Cod sursa (job #527181) | Cod sursa (job #1017144) | Cod sursa (job #380968) | Cod sursa (job #2647680)
#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],afis[102][2],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 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;
}
}
}
i=n;
latotal=l;
while (i>0)
{
afis[i][0]=latotal-ant[i][latotal];
afis[i][1]=dp[i][latotal]-dp[i-1][ant[i][latotal]];
latotal=ant[i][latotal];
i--;
}
for (i=1;i<=n;i++)
fout<<afis[i][0]<<' '<<afis[i][1]<<'\n';
}
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;
}