Pagini recente » Cod sursa (job #1869195) | Cod sursa (job #2442434) | Cod sursa (job #693319) | Cod sursa (job #2855583) | Cod sursa (job #1021308)
#include <fstream>
#define MAXN 105
#define MAXL 105
#define INF 2000000
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,ta[MAXN],tb[MAXN],st,dr,mij,pd[MAXL],v[MAXL],back[MAXL][MAXN],x;
bool merge(int t);
void afisare(int p,int q);
int main()
{
int i;
f>>n>>l;
for(i=1;i<=n;i++)
f>>ta[i]>>tb[i];
st=0;dr=(ta[1]+tb[1])*l;
while(st<dr){
mij=(st+dr)/2;
if(merge(mij))
dr=mij-1;
else
st=mij+1;}
while(!merge(st))
st++;
g<<st<<'\n';
merge(st);
afisare(l,n);
f.close();
g.close();
return 0;
}
bool merge(int t){
int i,j,k;
for(i=1;i<=l;i++)
pd[i]=-INF;
pd[0]=0;
for(i=1;i<=n;i++){
for(j=0;j<=l;j++){
if(t-j*ta[i]<0)
v[j]=-1;
else
v[j]=(t-j*ta[i])/tb[i];}
for(j=l;j>=0;j--){
if(pd[j]==-INF)
continue;
for(k=l-j;k>=0;k--){
if(v[k]<0)
continue;
if(pd[j]+v[k]>pd[j+k]){
pd[j+k]=pd[j]+v[k];
back[j+k][i]=j;}}}}
if(pd[l]>=l)
return 1;
return 0;}
void afisare(int p,int q){
if(q>1)
afisare(back[p][q],q-1);
x=p-back[p][q];
g<<x<<' '<<(st-x*ta[q])/tb[q]<<'\n';}