Pagini recente » Cod sursa (job #1895529) | Cod sursa (job #2592378) | Cod sursa (job #2907093) | Cod sursa (job #2290647) | Cod sursa (job #3305348)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define int long long
int n, need;
int dp[103][103]; ///dp[i][j] = cantitatea maxima de lapte 2 ce o bea primele i pers pt a bea si j lapte 1
int last[103][103];
int solA[110], solB[110];
struct Iris {
int a, b;
int index;
}v[110];
inline int check(int x) {
for(int i=0; i<=n; i++)
for(int j=0; j<=need; j++) dp[i][j] = -1;
dp[0][0] = 0;
for(int i=1; i<=n; i++) {
for(int j=1; j<=need; j++) {
for(int k=0; k<=j && k * v[i].a <= x; k++) {
if(dp[i - 1][j - k] >= 0) { ///verific daca pot sa beau j - k lapte 1 cu primele i - 1 persoane si sa mi ramana si de lapte 2
///o sa beau cu persoana 1 k litri de lapte1 => k * v[i].a timp
///=> imi mai raman x - k * v[i].a timp pt lapte2 sa cresc in dp[i][j]
int take = dp[i - 1][j - k] + (x - k * v[i].a) / v[i].b;
if(take > dp[i][j]) dp[i][j] = take, last[i][j] = k;
}
}
}
}
return dp[n][need] >= need;
}
signed main()
{
fin >> n >> need;
for(int i=1; i<=n; i++) {
fin >> v[i].a >> v[i].b;
v[i].index = i;
}
int st = 1, dr = 1e18, sol = -1;
while(st <= dr) {
int mid = (st + dr) / 2;
if(check(mid)) sol = mid, dr = mid - 1;
else st = mid + 1;
}
fout << sol << '\n';
check(sol);
for(int i=n; i>=1; i--) {
solA[i] = last[i][need];
solB[i] = (sol - last[i][need] * v[i].a) / v[i].b;
need -= last[i][need];
}
for(int i=1; i<=n; i++) fout << solA[i] << " " << solB[i] << '\n';
return 0;
}