Pagini recente » Istoria paginii utilizator/castiel15 | Cod sursa (job #1244474) | Cod sursa (job #1723236) | Cod sursa (job #757356) | Cod sursa (job #1784670)
#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[1][i] = -NMax * NMax * NMax;
D[1][0] = 0;
for(int i = 1; i <= n; i++){
copy(begin(D[1]), end(D[1]), begin(D[0]));
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[1][k] = max(D[1][k], D[0][k - j] + l);
}
}
}
return D[1][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;
}