Pagini recente » Cod sursa (job #3124781) | Cod sursa (job #332814) | Cod sursa (job #947909) | Cod sursa (job #892240) | Cod sursa (job #1828727)
#include <iostream>
#include <fstream>
#include <cstring>
#define Tmax 100
#define Nmax 105
#define Lmax 105
#define oo -(1<<30)
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int A[Nmax],B[Nmax],dp[Nmax][Lmax],solm[Nmax][Nmax];
int N,L,sol;
void read()
{
fin>>N>>L;
for(int i=1;i<=N;++i)
{
fin>>A[i]>>B[i];
}
}
bool check(int time)
{
memset(solm,0,sizeof(solm));
for(int i=0;i<=N;i++)
for(int j=0;j<=L;j++)
dp[i][j]=oo;
dp[0][0]=0;
for(int i=1;i<=N;i++)
{
for(int j=0;j<=L;++j)
{
for(int k=0; k<=j && k <= time/A[i] ;++k)
{
int milkB=(time-k*A[i])/B[i];
if(dp[i][j]<dp[i-1][j-k]+milkB)
{
dp[i][j]=dp[i-1][j-k]+milkB;
solm[i][j]=k;
}
}
}
}
if(dp[N][L]>=L)
return true;
return false;
}
void dei(int left,int right)
{
int mid=(left+right)/2;
if(left<=right)
{
bool ok=check(mid);
if(ok)
{
sol=mid;
dei(left,mid-1);
}
else
dei(mid+1,right);
}
}
void solve()
{
dei(1,Tmax);
}
void pr(int i,int j)
{
if(i)
{
pr(i-1,j-solm[i][j]);
fout<<solm[i][j]<<" "<<(sol-solm[i][j]*A[i])/B[i]<<"\n";
}
}
void print()
{
fout<<sol<<"\n";
check(sol);
pr(N,L);
}
int main()
{
read();
solve();
print();
return 0;
}