Pagini recente » Cod sursa (job #2868265) | Cod sursa (job #1356992) | Cod sursa (job #2904472) | Cod sursa (job #2625843) | Cod sursa (job #711812)
Cod sursa(job #711812)
#include <cstdio>
#include <vector>
using namespace std;
int n,L;
int a[105],b[105];
bool dp[105][105][105];
pair<int,int> sol[105][105][105];
pair<int,int> rasp[105];
int timpmin=1<<30;
bool caut(int timp)
{
dp[0][0][0]=true;
for(int i=1;i<=n;i++)
for(int ia=0;ia<=L;ia++)
for(int ib=0;ib<=L;ib++)
{
dp[i][ia][ib]=false;
for(int t=0;t<=timp;t+=a[i])
{
int x,y;
x=min(ia,t/a[i]);
y=min((timp-t)/b[i],ib);
if(dp[i-1][ia-x][ib-y]==true)
{
dp[i][ia][ib]=true;
sol[i][ia][ib]=make_pair(x,y);
break;
}
}
}
return dp[n][L][L];
}
void rez();
void cautbin()
{
int li=0,ls=100,mij;
while(li<=ls)
{
mij=(li+ls)/2;
if(caut(mij)==true)
{
ls=mij-1;
timpmin=mij;
rez();
}
else
li=mij+1;
}
return;
}
void rez()
{
int ia=L;
int ib=L;
for(int i=n;i>=1;i--)
{
rasp[i]=sol[i][ia][ib];
int aux=ia;
ia-=sol[i][ia][ib].first;
ib-=sol[i][aux][ib].second;
}
return;
}
int main()
{
freopen("lapte.in","r", stdin);
freopen("lapte.out","w", stdout);
scanf("%d %d",&n,&L);
for(int i=1;i<=n;i++)
scanf("%d %d",&a[i],&b[i]);
cautbin();
printf("%d\n",timpmin);
for(int i=1;i<=n;i++)
printf("%d %d\n",rasp[i].first,rasp[i].second);
return 0;
}