Pagini recente » Cod sursa (job #2202487) | Cod sursa (job #3355031) | Cod sursa (job #3327386) | Cod sursa (job #2520833) | Cod sursa (job #3348497)
#include <fstream>
#include <vector>
#define NMAX 105
#define LMAX 105
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int N,L,a[NMAX],b[NMAX],dp[NMAX][LMAX];
vector<int> solA(NMAX),solB(NMAX);
struct nod
{
int prev,x;
}t[NMAX][LMAX];
void citire()
{
fin>>N>>L;
for(int i=1; i<=N; i++)
{
fin>>a[i]>>b[i];
}
}
int ok(int T)
{
for(int i=0; i<=N; i++)
{
for(int j=0; j<=L; j++)
{
dp[i][j]=-1;
}
}
dp[0][0]=0;
for(int i=1; i<=N; i++)
{
for(int j=0; j<=L; j++)
{
if(dp[i-1][j]==-1)
{
continue;
}
for(int x=0; x*a[i]<=T; x++)
{
int y=(T-x*a[i])/b[i];
int nj=min(L,j+x);
int nb=dp[i-1][j]+y;
if(nb>dp[i][nj])
{
dp[i][nj]=nb;
t[i][nj]={j,x};
}
}
}
}
return dp[N][L]>=L;
}
void drum(int i, int j, int T)
{
if(i==0)
{
return;
}
drum(i-1,t[i][j].prev,T);
solA[i]=t[i][j].x;
solB[i]=(T-solA[i]*a[i])/b[i];
}
int main()
{
citire();
int p1,p2,pmijl,ans;
p1=ans=0;
p2=10000;
while(p1<=p2)
{
pmijl=(p1+p2)/2;
if(ok(pmijl))
{
ans=pmijl;
p2=pmijl-1;
}
else
{
p1=pmijl+1;
}
}
ok(ans);
fout<< ans << "\n";
drum(N,L,ans);
for(int i=1; i<=N; i++)
{
fout<< solA[i] << " " << solB[i] << "\n";
}
return 0;
}