Pagini recente » Cod sursa (job #2808569) | Cod sursa (job #2123977) | Cod sursa (job #3216360) | Cod sursa (job #2896808) | Cod sursa (job #2872430)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin( "lapte.in" );
ofstream fout( "lapte.out" );
const int MAX = 105;
int va[MAX], vb[MAX];
int dp[MAX][MAX];
int from[MAX][MAX];
int n, lp;
bool chk( int t ) {
for ( int i = 0; i <= lp; ++i ) {
dp[0][i] = -1e9;
}
dp[0][0] = 0;
for ( int i = 1; i <= n; ++i ) {
for ( int cA = 0; cA <= lp; ++cA ) {
dp[i][cA] = -1e9;
from[i][cA] = 0;
for ( int _cA = 0; _cA <= min(cA, t / va[i]); ++_cA ) {
int cB = (t - _cA * va[i]) / vb[i];
if ( dp[i][cA] < dp[i-1][cA - _cA] + cB ) {
from[i][cA] = cA - _cA;
dp[i][cA] = max(dp[i][cA], dp[i-1][cA - _cA] + cB);
}
}
}
}
return dp[n][lp] >= lp;
}
int main() {
fin >> n >> lp;
for ( int i = 1; i <= n; ++i ) {
fin >> va[i] >> vb[i];
}
int l = 0, r = 1e5;
while ( r - l > 1 ) {
int mid = (l + r) / 2;
if ( chk(mid) ) {
r = mid;
} else {
l = mid;
}
}
fout << r << "\n";
chk(r);
vector<pair<int, int>> sol;
int y = lp;
for ( int i = n; i >= 1; --i ) {
sol.push_back({y, dp[i][y]});
y = from[i][y];
}
fout << sol.back().first << " " << sol.back().second << "\n";
for ( int i = sol.size() - 2; i >= 0; --i ) {
fout << sol[i].first - sol[i+1].first << " " << sol[i].second - sol[i+1].second << "\n";
}
fin.close();
fout.close();
return 0;
}