Pagini recente » Cod sursa (job #2941046) | Cod sursa (job #375902) | Cod sursa (job #549278) | Cod sursa (job #2230996) | Cod sursa (job #2333912)
#include <fstream>
#include <cstring>
using namespace std;
int n, l, i, j, k, st, dr, b, sol;
struct vect {
int a, b;
}v[101], rez[101];
int d[101][101], tata[101][101];
int dinamica (int T) {
for (int i=1;i<=n;i++) {
for (int j=0;j<=l;j++)
d[i][j]=-1;
}
memset(tata, 0, sizeof(tata));
for (int i=0;i<=l && T-i*v[1].a>=0;i++) {
d[1][i]=(T-i*v[1].a)/v[1].b;
}
for (int i=2;i<=n;i++) {
for (int j=0;j<=l;j++) {
for (int k=0;k<=j;k++) {
if (T-(j-k)*v[i].a>=0) {
if (d[i-1][k]!=-1 && d[i][j]<d[i-1][k]+(T-(j-k)*v[i].a)/v[i].b) {
d[i][j]=d[i-1][k]+(T-(j-k)*v[i].a)/v[i].b;
tata[i][j]=k;
}
}
}
}
}
return d[n][l];
}
int main () {
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
fin>>n>>l;
for (i=1;i<=n;i++) {
fin>>v[i].a>>v[i].b;
}
st=1;
dr=100;
while (st<=dr) {
int mid=(st+dr)/2;
b=dinamica(mid);
if (b>=l) {
sol=mid;
dr=mid-1;
}else
st=mid+1;
}
b=dinamica(sol);
fout<<sol<<"\n";
k=l;
for (i=n;i>=1;i--) {
rez[i].b=d[i][k]-d[i-1][tata[i][k]];
rez[i].a=k-tata[i][k];
k=tata[i][k];
}
for (i=1;i<=n;i++) {
fout<<rez[i].a<<" "<<rez[i].b<<"\n";
}
return 0;
}