Pagini recente » Cod sursa (job #1201426) | Cod sursa (job #370168) | Cod sursa (job #1749387) | Cod sursa (job #570518) | Cod sursa (job #2663840)
#include <bits/stdc++.h>
using namespace std;
#define STOP fout.close(); exit(EXIT_SUCCESS);
ifstream fin("lapte.in");
ofstream fout("lapte.out");
///***********************
const int NMAX = 103;
struct Dude {
int a, b;
} d[NMAX], ans2[NMAX][NMAX][NMAX];
int n, l, ans;
bool dp[NMAX][NMAX][NMAX];
void read() {
fin >> n >> l;
for (int i = 1; i <= n; i++)
fin >> d[i].a >> d[i].b;
}
void init() {
dp[0][0][0] = true;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= l; j++)
for (int k = 0; k <= l; k++)
dp[i][j][k] = false;
dp[i][0][0] = true;
}
}
bool check(int t) {
init();
for (int i = 1; i <= n; i++)
for (int j = 0; j <= l; j++)
for (int k = 0; k <= l; k++)
for (int x = 0; x * d[i].a <= t && x <= j; x++) {
int y = (t - x * d[i].a) / d[i].b;
if (k >= y) {
if (dp[i - 1][j - x][k - y]) {
ans2[i][j][k] = {x, y};
dp[i][j][k] = 1;//cout << x << ' ' << y << endl;
break;
}
} else {
if (dp[i - 1][j - x][0]) {
ans2[i][j][k] = {x, k};
dp[i][j][k] = 1;//cout << x << ' ' << k << endl;
break;
}
}
}
return dp[n][l][l];
}
void solve() {
int l = 0, r = 100 * 100;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
fout << ans << '\n';
}
void build(int i, int j, int k) {
if (!i)
return;
build(i - 1, j - ans2[i][j][k].a, k - ans2[i][j][k].b);
//cout<<i<<' '<<j<<' '<<k<<endl;
fout << ans2[i][j][k].a << ' ' << ans2[i][j][k].b << '\n';
}
int main() {
read();
solve();
check(ans);
build(n, l, l);
//for (int i=1;i<=l;i++){for(int j=1;j<=l;j++)cout<<ans2[n][i][j].b<<' '; cout<<endl;}
STOP
}