Pagini recente » Cod sursa (job #3249085) | Cod sursa (job #1825330) | Cod sursa (job #333336) | Cod sursa (job #898906) | Cod sursa (job #1527852)
#include <fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int INF=1000000, NMAX=101;
int n, lit, sol, d[NMAX][NMAX], dd[NMAX][NMAX], a[NMAX], b[NMAX];
int ok(int val)
{
int i, j, k, x, y;
for(i=0; i<=n; i++)
{
for(j=0; j<=lit; j++)
d[i][j]=-10000;
d[i][0]=0;
}
for(i=1; i<=n; i++)
{
x=val/a[i];
for(k=0; k<=x; k++)
{
y=(val-k*a[i])/b[i];
for(j=lit; j>=k; j--)
if(d[i][j]<d[i-1][j-k]+y)
{
d[i][j]=d[i-1][j-k]+y;
dd[i][j]=k;
}
}
}
if(d[n][lit]>=lit)return 1;
return 0;
}
void rec(int n, int lit)
{
if(n==0)return ;
rec(n-1, lit-dd[n][lit]);
out<<dd[n][lit]<<' '<<(sol-a[n]*dd[n][lit])/b[n]<<'\n';
}
int main()
{
int i, l, r, mid=0;
in>>n>>lit;
for(i=1; i<=n; i++)
in>>a[i]>>b[i];
l=1;
r=100;
while(l<=r)
{
mid=(l+r)>>1;
if(ok(mid))
{
r=mid-1;
sol=mid;
}
else
l=mid+1;
}
out<<sol<<'\n';
rec(n, lit);
return 0;
}