Pagini recente » Cod sursa (job #2390711) | Istoria paginii runda/ojimari/clasament | Cod sursa (job #1128443) | Cod sursa (job #2120630) | Cod sursa (job #478489)
Cod sursa(job #478489)
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int beau[101][101],n,l;
int a[100],b[100];
int is_ok(int T)
{
int best1[101],best2[101];
for(int i=0;i<=l;i++)
{
best1[i]=-1;
best2[i]=-1;
}
for(int i=0;i<=T/a[0];i++)
best1[i]=(T-i*a[0])/b[0];
for(int i=1;i<n;i++)
{
for(int j=0;j<=l;j++)
{
for(int k=0;k<=T/a[i];k++)
{
if(j-k>=0 && best1[j-k]>=0)
{
int rap=(T-k*a[i])/b[i];
int nr=best1[j-k]+rap;
if(nr>best2[j])
{
best2[j]=nr;
beau[i][j]=k;
}
}
}
}
for(int i=0;i<=l;i++)
best1[i]=best2[i];
}
if(best1[l]>=l)
return 1;
return 0;
}
int search()
{
int left=0,right=150,rez;
while(left<=right)
{
int mij=left+(right-left)/2;
if(is_ok(mij))
{
right=mij-1;
rez=mij;
}
else
left=mij+1;
}
return rez;
}
void write_sol(int tmin)
{
ofstream out("lapte.out");
int lapteA[100],lapteB[100];
is_ok(tmin);
int cant=l;
for(int i=n-1;i>=0;i--)
{
lapteA[i]=beau[i][cant];
lapteB[i]=(tmin-beau[i][cant]*a[i])/b[i];
cant-=beau[i][cant];
}
out<<tmin<<"\n";
for(int i=0;i<n;i++)
out<<lapteA[i]<<" "<<lapteB[i]<<"\n";
out.close();
}
int main()
{
ifstream in("lapte.in");
in>>n>>l;
for(int i=0;i<n;i++)
in>>a[i]>>b[i];
in.close();
int tmin=search();
write_sol(tmin);
}