Pagini recente » Cod sursa (job #1881378) | Cod sursa (job #2049689) | Cod sursa (job #164196) | Cod sursa (job #2431535) | Cod sursa (job #1844022)
#include <fstream>
#define se second
#define fi first
using namespace std;
ifstream f ("lapte.in");
ofstream g ("lapte.out");
int dp[150][255] , pos[105][255];
int n , l , ans;
pair <int , int> v[205];
bool verif (int tmax) {
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= 2 * l; ++j) {
dp[i][j] = -1;
}
}
dp[0][0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= 2 * l; ++j) {
for (int k = 0; k <= tmax / v[i].fi; ++k) {
if (k > j)
break;
if (dp[i - 1][j - k] == -1)
continue;
/*if ((tmax - k * v[i].fi) % v[i].se != 0)
continue;*/
if (dp[i - 1][j - k] + (tmax - k * v[i].fi) / v[i].se > dp[i][j]) {
dp[i][j] = max (dp[i][j] , dp[i - 1][j - k] + (tmax - k * v[i].fi) / v[i].se);
pos[i][j] = k;
}
}
}
}
for (int i = l; i <= 2 * l; ++i) {
if (dp[n][i] >= l)
return 1;
}
return 0;
}
void afis (int i, int j) {
if (i == 0)
return;
afis (i - 1, j - pos[i][j]);
g << pos[i][j] << " " << (ans - pos[i][j] * v[i].fi) / v[i].se << '\n';
}
void write () {
int p1 = 0, p2 = 0;
bool ok = verif (ans);
for (int i = l; i <= 2 * l; ++i) {
if (dp[n][i] >= l) {
p1 = n, p2 = i;
break;
}
}
afis (p1, p2);
}
int cbin () {
int i , p = 0;
for (i = 1; i <= 105; i <<= 1);
while (i) {
if (i + p <= 105 && verif (i + p) == 0) {
p += i;
}
i >>= 1;
}
return p + 1;
}
int main() {
f >> n >> l;
for (int i = 1; i <= n; ++i) {
f >> v[i].fi >> v[i].se;
}
ans = cbin ();
g << ans << '\n';
write ();
return 0;
}