Pagini recente » Borderou de evaluare (job #1567437) | Cod sursa (job #2588128) | Cod sursa (job #3162786) | Cod sursa (job #800983) | Cod sursa (job #1052816)
#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[2][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)*a[i]<=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 t=n;int nr=0;
while(t>1){
nr++;
x[nr][1]=k-soll[t][k];
x[nr][2]=sol[t][k]-sol[t-1][soll[t][k]];
k=soll[t][k];
t--;
}
nr++;
x[nr][1]=k;
x[nr][2]=sol[1][k];
for(int i=nr;i>=1;i--)
g<<x[i][1]<<" "<<x[i][2]<<"\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;
}