Pagini recente » Cod sursa (job #229023) | Cod sursa (job #1441259) | Cod sursa (job #1398431) | Cod sursa (job #2119648) | Cod sursa (job #1847351)
#include <fstream>
using namespace std;
ifstream in ("lapte.in");
ofstream out ("lapte.out");
int DP[150][255],pos[105][255];
int n,l,ans;
pair <int,int> v[205];
bool Check (int arg)
{
for (int i=0;i<=n;i++)
{
for (int j=0;j<=2*l;j++)
{
DP[i][j]=-1;
}
}
DP[0][0]=0;
for (int i=1;i<=n;i++)
{
for (int j=0;j<=2*l;j++)
{
for (int k=0;k<arg/v[i].first;k++)
{
if (k>j)
break;
if (DP[i-1][j-k]==-1)
continue;
if (DP[i-1][j-k]+(arg-k*v[i].first)/v[i].second>DP[i][j])
{
DP[i][j]=max(DP[i][j],DP[i-1][j-k]+(arg-k*v[i].first));
pos[i][j]=k;
}
}
}
}
for (int i=l;i<=2*l;i++)
{
if (DP[n][i]>=l)
return 1;
}
return 0;
}
void Afis(int i,int j)
{
if (i==0)
return;
Afis(i-1,j-pos[i][j]);
out<<pos[i][j]<<' ';
out<<(ans-pos[i][j]*v[i].first)/v[i].second<<'\n';
}
void Print()
{
int p1=0;int p2=0;
bool ok=Check(ans);
for (int i=l;i<2*l;i++)
{
if (DP[n][i]>=l)
{
p1=n;
p2=i;
break;
}
}
Afis(p1,p2);
}
int Search_Bin ()
{
int i,p=0;
for (i=1;i<=105;i<<=1);
while (i)
{
if (i+p<=105&&Check(i+p)==0)
{
p+=i;
}
i>>=1;
}
return p+1;
}
int main()
{
in>>n>>l;
for (int i=1;i<=n;i++)
{
in>>v[i].first>>v[i].second;
}
ans=Search_Bin();
out<<ans<<'\n';
Print();
return 0;
}