Pagini recente » Cod sursa (job #1467253) | Cod sursa (job #1212426) | Cod sursa (job #2386688) | Cod sursa (job #1726846) | Cod sursa (job #1784668)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int NMax = 105;
int A[NMax];
int B[NMax];
inline bool check(const int &n, const int &m, const int &t){
int D[2][NMax];
for(int i = 0; i <= m; i++) D[0][i] = -NMax * NMax * NMax;
for(int i = 0; i <= m; i++) D[1][i] = 0;
D[0][0] = 0;
int cur = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m && j * A[i] <= t; j++){
const int l = (t - j * A[i]) / B[i];
for(int k = m; k - j >= 0; k--){
D[cur][k] = max(D[cur][k], D[1 - cur][k - j] + l);
}
}
cur = 1 - cur;
}
cur = 1 - cur;
return D[cur][m] >= m;
}
inline void solve(const int &n, const int &m, const int &t){
int D[NMax][NMax];
for(int i = 0; i <= n; i++){
for(int j = 0; j <= m; j++){
D[i][j] = -NMax * NMax * NMax;
}
}
D[0][0] = 0;
pair < int, int > prev[NMax][NMax];
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m && j * A[i] <= t; j++){
const int l = (t - j * A[i]) / B[i];
for(int k = m; k - j >= 0; k--){
if(D[i - 1][k - j] + l > D[i][k]){
D[i][k] = D[i - 1][k - j] + l;
prev[i][k] = {j, l};
}
}
}
}
vector < pair < int, int > > rez(n);
for(int i = n, j = m; i > 0; i--){
rez[i - 1] = prev[i][j];
j -= rez[i - 1].first;
}
for(auto it: rez) fout << it.first << " " << it.second << "\n";
}
int main(){
ios::sync_with_stdio();
fin.tie(NULL);
int n, m;
fin >> n >> m;
for(int i = 1; i <= n; i++) fin >> A[i] >> B[i];
int lo, hi, mid, ans;
lo = 1; hi = NMax * NMax;
while(lo <= hi){
mid = (lo + hi) / 2;
if(check(n, m, mid) == true){
ans = mid;
hi = mid - 1;
} else {
lo = mid + 1;
}
}
fout << ans << "\n";
solve(n, m, ans);
return 0;
}