Pagini recente » Borderou de evaluare (job #2830521) | Cod sursa (job #2541088) | Cod sursa (job #2160978) | Cod sursa (job #1287349) | Cod sursa (job #2394623)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int st, dr, a[103][103], dp[103][103], n, L, sol;
struct timpi{
int a, b;
}v[103];
void afis(int n, int L)
{
if(n)
{
afis(n-1, L-a[n][L]);
fout<<a[n][L]<<" "<<(sol-a[n][L]*v[n].a)/v[n].b<<"\n";
}
}
bool sepoate(int t)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=L;++j) dp[i][j]=-1;
for(int j=0;j<=min(t/v[1].a, L);++j) dp[1][j]=(t-j*v[1].a)/v[1].b, a[1][j]=j;
for(int i=2;i<=n;++i)
for(int j=0;j<=min(t/v[i].a, L);++j)
for(int k=j;k<=L;++k)
{
if(dp[i-1][k-j]!=-1)
if(dp[i][k]<dp[i-1][k-j]+(t-j*v[i].a)/v[i].b)
{
dp[i][k]=dp[i-1][k-j]+(t-j*v[i].a)/v[i].b;
a[i][k]=j;
}
}
if(dp[n][L]>=L)
return 1;
return 0;
}
int main()
{
fin>>n>>L;
for(int i=1;i<=n;++i) fin>>v[i].a>>v[i].b;
st=1, dr=L*v[1].a+L*v[1].b;
while(st<dr)
{
int m=(st+dr)/2;
if(sepoate(m)) dr=m-1,sol=m;
else st=m+1;
}
sepoate(sol);
fout<<sol<<"\n";
afis(n, L);
return 0;
}