Pagini recente » Cod sursa (job #1396559) | Cod sursa (job #2395768) | Cod sursa (job #2368217) | Cod sursa (job #329712) | Cod sursa (job #2762249)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
typedef pair<int,int> pii;
int n,l,minim=1000,dp[105][105];
pii v[105],sol[105];
bool ok(int timp)
{
dp[0][0]=0;
for(int i=1;i<=l;i++)
dp[0][i]=-1000;
for(int i=1;i<=n;i++)
for(int a=0;a<=l;a++)
{
dp[i][a]=-1000;
for(int nrA=0;nrA<=min(a,timp/v[i].first);nrA++)
{
int nrB=(timp-v[i].first*nrA)/v[i].second;
dp[i][a]=max(dp[i][a],nrB+dp[i-1][a-nrA]);
}
}
return dp[n][l]>=l;
}
int main()
{
fin>>n>>l;
for(int i=1;i<=n;i++)
fin>>v[i].first>>v[i].second;
int st=1;
int dr=100;
while(st<=dr)
{
int mij=(st+dr)/2;
if(ok(mij))
{
minim=min(minim,mij);
dr=mij-1;
}
else
st=mij+1;
}
fout<<minim<<'\n';
ok(minim);
int Aleft=l;
int Bleft=l;
for(int i=n;i>=1;i--)
{
for(int nrA=0;nrA<=min(Aleft,minim/v[i].first);nrA++)
{
int nrB=(minim-v[i].first*nrA)/v[i].second;
if(dp[i-1][Aleft-nrA]>=Bleft-nrB)
{
sol[i]={nrA,nrB};
Aleft-=nrA;
Bleft-=nrB;
break;
}
}
}
for(int i=1;i<=n;i++)
fout<<sol[i].first<<" "<<sol[i].second<<'\n';
return 0;
}