Pagini recente » Cod sursa (job #1788288) | Cod sursa (job #658985) | Cod sursa (job #894631) | Cod sursa (job #1365836) | Cod sursa (job #1020414)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int NMAX = 102;
int dp[NMAX][NMAX];
int who[NMAX][NMAX];
int N, L;
int a[NMAX], b[NMAX];
int ra[NMAX], rb[NMAX];
int solve(int t) {
int lapteA, lapteB;
for(int k = 0;k <= L;k++) {
dp[1][k] = -int(1e9);
}
lapteA = min(L,t/a[1]);
for(int k = 0;k <= lapteA;k++) {
dp[1][k] = (t - a[1]*k)/b[1];
who[1][k] = 1 | k<<7;
}
for(int i = 2;i <= N;i++) {
for(int k = 0;k <= L;k++) {
dp[i][k] = dp[i - 1][k];
who[i][k] = who[i - 1][k];
}
lapteA = min(L,t/a[i]);
for(int j = 0;j <= lapteA;j++) {
lapteB = (t - a[i]*j)/b[i];
if(dp[i][j] < lapteB) {
dp[i][j] = lapteB;
who[i][j] = i | j<<7;
}
for(int k = j;k <= L;k++) {
if(dp[i - 1][k - j] + lapteB > dp[i][k]) {
dp[i][k] = dp[i - 1][k - j] + lapteB;
who[i][k] = i | j<<7;
}
}
}
}
return dp[N][L] >= L;
}
void build(int milk,int t) {
int i = N;
// printf("\n");
while(milk || who[i][milk] != 0) {
// printf("(%d)\n",i);
while(i > (who[i][milk] & 127)) i--;
int j = who[i][milk]>>7;
ra[i] += j;
rb[i] += (t - a[i]*j)/b[i];
i--;
milk -= j;
}
}
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 t = 0;
for(int step = 64;step > 0;step >>= 1) {
if(solve(t + step) == false) {
t += step;
}
}
t++;
printf("%d\n",t);
solve(t);
build(L,t);
for(int i = 1;i <= N;i++) {
printf("%d %d\n",ra[i],rb[i]);
}
return 0;
}