Pagini recente » Cod sursa (job #1701856) | Cod sursa (job #600331) | Cod sursa (job #2481346) | Cod sursa (job #1007976) | Cod sursa (job #2488484)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 105;
const int INF = 2e9;
struct om_respectabil_nu_betiv{
int a,b;
void print()
{
printf("%d %d\n",a,b);
}
};
int n , L;
int dp[NMAX][NMAX];
om_respectabil_nu_betiv v[NMAX];
om_respectabil_nu_betiv m[NMAX][NMAX];
om_respectabil_nu_betiv cm[NMAX][NMAX];
vector<om_respectabil_nu_betiv>sol;
inline void dezintoxicare();
inline void bea_cat_mai_mult(int timp);
inline void cpy();
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
int a , b;
scanf("%d%d",&n,&L);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d%d",&a,&b);
om_respectabil_nu_betiv temp;
temp.a = a;
temp.b = b;
v[i] = temp;
}
int st,dr,med;
int ans = -1;
st = 1;
dr = 100;
while(st <= dr)
{
med = (st+dr)/2;
dezintoxicare();
bea_cat_mai_mult(med);
if(dp[n][L] >= L)
{
dr = med-1;
ans = med;
cpy();
}
else
st = med+1;
}
printf("%d\n",ans);
while(n && L >= 0)
{
om_respectabil_nu_betiv temp = cm[n][L];
sol.push_back(temp);
n--;
L -= cm[n][L].a;
}
reverse(sol.begin(),sol.end());
for(int i = 0 ; i < sol.size() ; i++)
sol[i].print();
return 0;
}
inline void dezintoxicare()
{
for(int i = 0 ; i <= n ; i++)
for(int j = 0 ; j <= L ; j++)
dp[i][j] = -INF;
}
inline void bea_cat_mai_mult(int timp)
{
dp[0][0] = 0;
for(int i = 1 ; i <= n ; i++){
for(int j = 0 ; j <= L ; j++){
for(int x = 0 ; x <= j ; x++)
{
if(dp[i-1][j-x] == -INF)
continue;
if(v[i].a*x > timp)
continue;
int lb = (timp-v[i].a*x)/v[i].b;
if(dp[i][j] < dp[i-1][j-x] + lb)
{
dp[i][j] = dp[i-1][j-x] + lb;
m[i][j].a = x;
m[i][j].b = lb;
}
}
}
}
}
inline void cpy()
{
for(int i = 1 ; i <= n ; i++)
for(int j = 0 ; j <= L ; j++)
cm[i][j] = m[i][j];
}