Pagini recente » Cod sursa (job #1916749) | Cod sursa (job #2717549) | Cod sursa (job #177757) | Cod sursa (job #1473337) | Cod sursa (job #3040367)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int nmax = 102;
const int inf = 0x3f3f3f3f;
int n, l, t, sol;
int dp[nmax][nmax], tA[nmax], tB[nmax];
int bestX[nmax][nmax];
bool verify(){
int y;
for(int i = 0; i <= n; i++)
for (int j = 0; j <= l; j++)
dp[i][j] = -inf, bestX[i][j] = 0;
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= l; j++) {
for (int x = 0; x * tA[i] <= t && x <= j; x++){
y = t - x * tA[i];
if(dp[i - 1][j - x] + y / tB[i] > dp[i][j]){
dp[i][j] = dp[i - 1][j - x] + y / tB[i];
bestX[i][j] = x;
}
}
}
}
return (dp[n][l] >= l);
}
void reconst(int i, int j) {
if(i == 0){
return;
}
int x = bestX[i][j];
int y = (sol - x * tA[i]) / tB[i];
reconst(i - 1, j - x);
fout << x << " " << y <<"\n";
}
int main(){
fin >> n >> l;
for (int i = 1; i <= n; i++)
fin >> tA[i] >> tB[i];
int st, dr;
st = 0;
dr = 20000;
while (st <= dr) {
t = (st + dr) / 2;
if (verify ()) {
sol = t;
dr = t - 1;
}
else{
st = t + 1;
}
}
fout << sol << '\n';
t = sol;
verify();
reconst(n, l);
return 0;
}