Pagini recente » Cod sursa (job #3343291) | Monitorul de evaluare | Cod sursa (job #286106) | Cod sursa (job #1019545) | Cod sursa (job #3351926)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int INF = 1000000000;
int n,l;
int vA[105];
int vB[105];
int dp[105][105];
int aux[105][105];
int tmin;
vector<pair<int, int>> ans;
void read()
{
fin >> n >> l;
for(int i = 1; i <= n; ++i){
fin >> vA[i] >> vB[i];
}
}
void buildDP(int t)
{
for(int j = 1; j <= l; ++j){
dp[0][j] = -INF;
}
for(int i = 1; i <= n; ++i){
for(int j = 0; j <= l; ++j){
for(int a = 0; a <= j; ++a){
if(a * vA[i] > t){
break;
}
int maxB = dp[i - 1][j - a] + (t - a * vA[i]) / vB[i];
if(maxB > dp[i][j]){
dp[i][j] = maxB;
aux[i][j] = j - a;
}
}
}
}
}
bool check(int t)
{
for(int i = 0; i <= n; ++i){
for(int j = 0; j <= l; ++j){
dp[i][j] = 0;
}
}
buildDP(t);
if(dp[n][l] >= l){
return true;
}
return false;
}
void binarySearch()
{
int l = 1, r = 20000;
while(l <= r){
int m = (l + r) / 2;
if(check(m)){
r = m - 1;
}
else{
l = m + 1;
}
}
if(check(r)){
tmin = r;
}
else if(check(l)){
tmin = l;
}
}
void print()
{
fout << tmin << '\n';
int j = l;
for(int i = n; i >= 1; --i){
int a = j - aux[i][j];
int b = (tmin - a * vA[i]) / vB[i];
ans.push_back(make_pair(a, b));
j = aux[i][j];
}
for(int i = ans.size() - 1; i >= 0; --i){
fout << ans[i].first << ' ' << ans[i].second << '\n';
}
}
int main()
{
read();
binarySearch();
print();
return 0;
}