Pagini recente » Cod sursa (job #585541) | Cod sursa (job #1733026) | Cod sursa (job #2500376) | Cod sursa (job #1502600) | Cod sursa (job #2237161)
#include <fstream>
#include <vector>
#define VAL 105
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int N, L, i, j, A[VAL], B[VAL];
int SOL1[VAL], SOL2[VAL], dp[VAL][VAL];
int last[VAL][VAL], X, Y, mx, ind;
bool Check(int T)
{
mx=0;
for (i=1; i<=N; i++)
{
for (j=0; j<VAL; j++)
dp[i][j]=last[i][j]=-VAL*VAL;
for (X=0; X<=T; X++)
{
if (X*A[i]>T)
break;
Y=(T-X*A[i]) / B[i];
if (i==1)
{
if (Y>dp[i][X])
{
dp[i][X]=Y;
last[i][X]=0;
}
}
else
{
for (j=X; j<VAL; j++)
{
if (dp[i-1][j-X]!=-VAL*VAL)
{
if (dp[i-1][j-X]+Y>dp[i][j])
{
last[i][j]=j-X;
dp[i][j]=dp[i-1][j-X]+Y;
}
}
}
}
}
}
mx=0;
for (j=L; j<VAL; j++)
{
if (dp[N][j]>mx)
{
mx=dp[N][j];
ind=j;
}
}
if (mx<L)
return false;
for (i=N; i>=1; i--)
{
SOL1[i]=ind-last[i][ind];
SOL2[i]=(T-A[i]*SOL1[i]) / B[i];
ind=last[i][ind];
}
return true;
}
int Binary_Search()
{
int be=1, en=VAL-5;
int mid, ANS=0;
while (be<=en)
{
mid=(be+en) / 2;
if (Check(mid)==true)
{
ANS=mid;
en=mid-1;
}
else
be=mid+1;
}
return ANS;
}
int main()
{
fin >> N >> L;
for (i=1; i<=N; i++)
fin >> A[i] >> B[i];
fout << Binary_Search() << '\n';
for (i=1; i<=N; i++)
fout << SOL1[i] << " " << SOL2[i] << '\n';
fin.close();
fout.close();
return 0;
}