Pagini recente » Cod sursa (job #843706) | Cod sursa (job #1527204) | Cod sursa (job #1486939) | Cod sursa (job #2785586) | Cod sursa (job #69426)
Cod sursa(job #69426)
#include <cstdio>
#include <string>
using namespace std;
#define Nmax 128
int best[Nmax*2], a[Nmax], b[Nmax], n,l;
int use1[Nmax], use2[Nmax], use[Nmax][Nmax*2];
int good(int T)
{
memset(use,0,sizeof(use));
memset(best,-1,8*Nmax);
best[0] = 0;
#define comp(A,B) if (A<B) A = (B), use[i][j+k] = j;
// aka am baut j litri de A, si .. B
for (int i=1;i<=n;++i)
for (int k=200;k>=0;--k) if (best[k] >= 0)
for(int j=T/a[i];j>=0;--j) if (j + k <= 200)
comp(best[j+k],((T-a[i]*j)/b[i])+best[k])
for (int i=200;i>=l;--i)
if(best[i] >= l)
return i;
return 0;
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
int ret = 0;
for (int i=1;i<=n;++i)
scanf("%d%d",a+i,b+i);
int rec;
#define pow(w) (1<<(w))
#define Q(i) if ((rec = good(ret + pow(i))) == 0) ret += pow(i);
Q(6) Q(5) Q(4) Q(3) Q(2) Q(1) Q(0)
while(rec == 0) rec = good(++ret);
for (int i=n;i>0;--i)
{
use1[i] = use[i][rec];
use2[i] = (ret-use1[i]*a[i])/b[i];
rec -= use1[i];
}
printf("%d\n",ret);
for (int i=1;i<=n;++i)
printf("%d %d\n",use1[i],use2[i]);
return 0;
}