Pagini recente » Cod sursa (job #833098) | Cod sursa (job #491486) | Cod sursa (job #2187140) | Cod sursa (job #230152) | Cod sursa (job #1052792)
#include <fstream>
#include<string.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,a[101],b[101],v[101][101],sol[101][101],i,tbun,x[101],soll[101][101];
int din(int t){
memset(v,0,sizeof(v));
memset(soll,0,sizeof(soll));
for(int i=0;i<=t;i++){
v[1][i]=(t-i*a[1])/b[1];
soll[1][i]=i;
}
for(int i=2;i<=n;i++)
for(int j=0;j<=l;j++)
for(int k=0;k<=j;k++)
if(j-k<=t)
if(v[i][j]<v[i-1][k]+(t-(j-k)*a[i])/b[i]){
v[i][j]=v[i-1][k]+(t-(j-k)*a[i])/b[i];
soll[i][j]=k;
}
if(v[n][l]>=l)
return 1;
return 0;
}
void reconstit(int n,int k){
int tt=n;int nr=0;
while(tt>=1){
nr++;
x[nr]=k;
k=soll[tt][k];
tt--;
}
g<<x[nr]<<" "<<sol[1][x[nr]]<<'\n';
for(int i=nr-1,tt=2;i>=1;i--,tt++){
g<<x[i]-x[i+1]<<" "<<sol[tt][x[i]]-sol[tt-1][x[i+1]]<<'\n';
}
}
int main()
{
f>>n>>l;
for(i=1;i<=n;i++){
f>>a[i]>>b[i];
}
int p=0;
int u=10000;
while(p<=u){
int mij=(p+u)/2;
int k=din(mij);
if(k){
tbun=mij;
memcpy(sol,v,sizeof(v));
u=mij-1;
}
else
p=mij+1;
}
g<<tbun<<'\n';
reconstit(n,l);
return 0;
}