Pagini recente » Cod sursa (job #135681) | Cod sursa (job #787197) | Cod sursa (job #639477) | Cod sursa (job #2398655) | Cod sursa (job #329279)
Cod sursa(job #329279)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 102;
const int INF = 0x3f3f3f3f;
int n, m, sol;
int a[MAX_N], b[MAX_N];
int solx[MAX_N], soly[MAX_N];
int x[MAX_N], y[MAX_N];
void print(int a[])
{
for (int i = 1; i <= n; ++i)
printf("%d ", a[i]);
printf("\n");
}
int check(int T)
{
int d[MAX_N][MAX_N];
int i, j, k;
//T = 18;
memset(d, 0, sizeof(d));
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
for (i = 0; i <= m; ++i) d[0][i] = -INF;
d[0][0] = 0;
for (i = 1; i <= n; ++i)
for (j = 0; j <= m; ++j)
for (k = 0; k <= j && k * a[i] <= T; ++k)
d[i][j] = max(d[i][j], d[i - 1][j - k] + (T - k * a[i]) / b[i]);
i = n;
j = m;
while (i)
{
int r;
for (k = 0; k <= j; ++k)
if (d[i][j] == d[i - 1][j - k] + (T - k * a[i]) / b[i])
{
r = k;
break;
}
x[i] = r;
y[i] = (T - r * a[i]) / b[i];
j -= r;
--i;
}
/*print(x);
print(y);
printf("%d\n", d[n][m]);
printf("\n");*/
if (d[n][m] >= m) return 1;
return 0;
}
void bin(int st, int dr)
{
while (st <= dr)
{
int mij = (st + dr) >> 1;
if (check(mij))
{
dr = mij - 1;
sol = mij;
memcpy(solx, x, sizeof(x));
memcpy(soly, y, sizeof(y));
// printf("%d\n", mij);
// print(x);
// print(y);
}
else st = mij + 1;
}
}
int main()
{
int i;
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= n; ++i)
scanf("%d %d", &a[i], &b[i]);
bin(1, 10000);
printf("%d\n", sol);
for (i = 1; i <= n; ++i)
printf("%d %d\n", solx[i], soly[i]);
}