Pagini recente » Cod sursa (job #501047) | Cod sursa (job #1333192) | Cod sursa (job #283247) | Cod sursa (job #1284301) | Cod sursa (job #3328022)
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <utility>
FILE* fin;
FILE* fout;
const int MAX_N = 100;
const int MAX_T = 100;
const int MAX_L = 100;
const int INF = 1e9;
struct MyDp {
int dp;
int from;
};
int n, l;
int a[MAX_N], b[MAX_N];
MyDp dp[MAX_N + 1][MAX_L + 1];
bool doza(int mij) {
for(int i = 1; i <= l; i++) {
dp[0][i] = {-INF, 0};
}
dp[0][0] = {0, 0};
for(int i = 0; i < n; i++) {
for(int j = 0; j <= l; j++) {
dp[i + 1][j] = {dp[i][j].dp, j};
}
for(int j = 0; j <= mij / a[i]; j++) {
for(int k = 0; k <= l - j; k++) {
int val = dp[i][k].dp + (mij - j * a[i]) / b[i];
if(val > dp[i + 1][k + j].dp) {
dp[i + 1][k + j] = {val, k};
}
}
}
}
return dp[n][l].dp >= l;
}
int main() {
fin = fopen("lapte.in", "r");
fout = fopen("lapte.out", "w");
fscanf(fin, "%d%d", &n, &l);
for(int i = 0; i < n; i++) {
fscanf(fin, "%d%d", &a[i], &b[i]);
}
int st = 0;
int dr = MAX_T;
while(dr - st > 1) {
int mij = (st + dr) / 2;
if(doza(mij)) {
dr = mij;
} else {
st = mij;
}
}
fprintf(fout, "%d\n", dr);
doza(dr);
std::vector<std::pair<int, int>> ans;
int i = l;
for(int ptr = n; ptr >= 1; ptr--) {
int diff_a = i - dp[ptr][i].from;
int diff_b = dp[ptr][i].dp - dp[ptr - 1][dp[ptr][i].from].dp;
ans.push_back({diff_a, diff_b});
i = dp[ptr][i].from;
}
std::reverse(ans.begin(), ans.end());
for(auto [x, y] : ans) {
fprintf(fout, "%d %d\n", x, y);
}
fclose(fin);
fclose(fout);
return 0;
}