Pagini recente » Cod sursa (job #160316) | Cod sursa (job #621647) | Cod sursa (job #2229981) | Cod sursa (job #2150142) | Cod sursa (job #3142172)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int maxN = 105, inf = (1 << 30);
int n, L;
struct bautor {
int a, b;
}v[maxN], sol[maxN];
int dp[maxN][maxN];
bool check(int val) {
for (int i = 0; i <= n; i++)
for (int j = 0; j <= L; j++)
dp[i][j] = -inf;
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= L; j++) {
for (int lA = 0; lA <= j; lA++) {
int tA = lA * v[i].a;
int tB = val - tA;
if(tB < 0)
break;
int lB = tB / v[i].b;
dp[i][j] = max(dp[i][j], dp[i - 1][j - lA] + lB);
}
}
}
return (dp[n][L] >= L);
}
int main()
{
fin >> n >> L;
for (int i = 1; i <= n; i++)
fin >> v[i].a >> v[i].b;
int ans = 0;
for (int i = (1 << 20); i; i >>= 1) {
if(!check(ans + i))
ans += i;
}
ans++;
fout << ans << '\n';
check(ans);
int currA = L, currB = L;
for(int i = n; i >= 1; i--) {
for(int lA = 0; lA <= currA; lA++) {
int tA = lA * v[i].a;
int tB = ans - tA;
int lB = tB / v[i].b;
if(dp[i][currA] == (dp[i - 1][currA - lA] + lB)) {
sol[i].a = lA;
sol[i].b = lB;
currA -= lA;
currB -= lB;
break;
}
}
}
for(int i = 1; i <= n; i++)
fout << sol[i].a << ' ' << sol[i].b << '\n';
return 0;
}