Pagini recente » Cod sursa (job #2967302) | Cod sursa (job #100056) | Cod sursa (job #179150) | Cod sursa (job #2960367) | Cod sursa (job #2486956)
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, l, sp[105];
pair <int, int> v[105], dp[105][105];
vector <int> a[105];
vector <pair <int, int> > sol;
bool okk(int t)
{
int len;
memset(dp, 0, sizeof(dp));
memset(sp, 0, sizeof(sp));
for(int i=1; i<=n; i++)
{ a[i].clear();
int ok = 1, j = 0;
while(ok)
{ if(t - j*v[i].first < 0) ok = 0, sp[i] = sp[i-1] + j-1;
else a[i].push_back((t - j*v[i].first) / v[i].second);
j++;
}
}
len = a[1].size()-1;
for(int i=0; i<=min(len, l); i++)
{ dp[1][i].first = a[1][i];
dp[1][i].second = i;
}
for(int i=2; i<=n; i++)
{ len = a[i].size()-1;
for(int j=0; j<=min(sp[i], l); j++)
{ for(int k=0; k<=min(j, len); k++)
if(dp[i-1][j-k].first + a[i][k] > dp[i][j].first)
{ dp[i][j].first = max(dp[i][j].first, dp[i-1][j-k].first + a[i][k]);
dp[i][j].second = k;
}
}
}
if(dp[n][l].first >= l)
{ sol.clear();
int j = l;
for(int i=n; i>=1; i--)
{ sol.push_back(make_pair(dp[i][j].second, a[i][dp[i][j].second]));
j -= dp[i][j].second;
}
return 1;
}
return 0;
}
int main()
{
f >> n >> l;
for(int i=1; i<=n; i++)
f >> v[i].first >> v[i].second;
int st = 1, dr = 100;
while(st < dr)
{ int mij = (st + dr) / 2;
if(okk(mij)) dr = mij;
else st = mij + 1;
}
g << dr << '\n';
for(int i=sol.size()-1; i>=0; i--) g << sol[i].first << ' ' << sol[i].second << '\n';
return 0;
}