Pagini recente » Cod sursa (job #2590372) | Cod sursa (job #1266646) | Cod sursa (job #2066360) | Cod sursa (job #2210339) | Cod sursa (job #69435)
Cod sursa(job #69435)
#include <cstdio>
#include <string>
using namespace std;
#define Nmax 101
int a[Nmax], b[Nmax], n,l;
//#define int short
int best[Nmax*2];
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=2*l;k>=0;--k) if (best[k] >= 0)
for(int j=T/a[i];j>=0;--j) if (j + k <= 2*l)
comp(best[j+k],((T-a[i]*j)/b[i])+best[k])
for (int i=2*l;i>=l;--i)
if(best[i] >= l)
return i;
return 0;
}
//#undef int
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
for (int i=1;i<=n;++i)
scanf("%d%d",a+i,b+i);
int rec,ret=0;
#define pow(w) (1<<(w))
#define Q(i) rec = good(ret + pow(i)); if (rec == 0) ret += pow(i);
Q(6) Q(5) Q(4) Q(3) Q(2) Q(1) Q(0)
--ret;
do { rec = good(++ret); } while(rec == 0);
printf("%d\n",ret);
for (int i=1;i<=n;++i)
{
printf("%d %d\n",use[i][rec],(ret-use[i][rec]*a[i])/b[i]);
rec -= use[i][rec];
}
return 0;
}