Pagini recente » Cod sursa (job #496863) | Cod sursa (job #2683006) | Cod sursa (job #2468911) | Cod sursa (job #2244666) | Cod sursa (job #1668383)
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define mp make_pair
using namespace std;
int N, L, A[109], B[109];
bool dp[109][109][109];
pair<int, int>fol[109][109][109];
vector < pair<int, int>>ans;
/*/
dp(i,j,k) = am primele i nr
daca pot bea
j din A si k din B
dp(i,j,k)=dp(i-1,j-x,k-y)
/*/
void Read()
{
freopen("lapte.in", "r", stdin);
scanf("%d%d", &N, &L);
for(int i = 0; i < N; ++i)
scanf("%d %d", A + i, B + i);
}
bool ok(int mij)
{
for(int i=0;i<=L;++i)for(int j=0;j<=L;++j)dp[0][i][j]=0;
for(int i = 0; i * A[0] <= mij && i <= L * 2; ++i)
for(int j = 0; i * A[0] + j * B[0] <= mij && j <= L * 2; ++j)
dp[0][i][j] = 1, fol[0][i][j] = mp(i, j);
for(int i = 1; i < N; ++i) {
for(int a = 0; a <= L; ++a)
for(int b = 0; b <= L; ++b) {
dp[i][a][b] = 0;
for(int x = 0; x <= a && A[i] * x <= mij; ++x)
for(int y = 0; y <= b && ((A[i] * x + B[i] * y) <= mij); ++y) {
if(dp[i - 1][a - x][b - y])
fol[i][a][b] = mp(x, y), dp[i][a][b] = 1;
}
}
if(dp[i][L][L])return 1;
}
return 0;
}
void restore(int pas,int x, int y, int timp)
{
if(pas==0){ans.pb(fol[pas][x][y]); return;}
restore(pas-1,x - fol[pas][x][y].first, y - fol[pas][x][y].second, timp);
ans.pb(fol[pas][x][y]);
}
void Solve()
{
int st = 0, dr = 100, res = 0;
while(st<=dr)
{
int m = (st+dr)>>1;
if(ok(m))
{
res = m;
dr = m - 1;
ans.clear();
restore(N - 1, L, L, m);
}
else st= m+1;
}
freopen("lapte.out", "w", stdout);
printf("%d\n", res);
for(auto itr : ans)
printf("%d %d\n", itr.first, itr.second);
}
int main()
{
Read();
Solve();
}