Pagini recente » Cod sursa (job #143559) | Cod sursa (job #1490414) | Cod sursa (job #914848) | Cod sursa (job #2233089) | Cod sursa (job #1831769)
#include<bits/stdc++.h>
using namespace std;
int a[105],b[105],dp[105][10005],n,l,st,dr,mid,sol;
bool ok(int timp)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<=(n*timp);j++) dp[i][j]=0;
}
for(int i=0;i<=timp;i+=a[1]) dp[1][i/a[1]]=(timp-i)/b[1];
for(int i=2;i<=n;i++)
{
for(int j=0;j<=timp;j+=a[i])
for(int k=0;k<=(n*timp);k++)
dp[i][j/a[i]+k]=max(dp[i][j/a[i]+k],dp[i-1][k]+(timp-j)/b[i]);
}
for(int i=l;i<=(n*timp);i++)
{
if(dp[n][i]>=l) return 1;
}
return 0;
}
void reconstruieste(int t,int i,int lc) {
if (i!=1)
{
reconstruieste(t,i-1,lc-dp[i][lc]);
}
printf("%d %d\n",dp[i][lc],(t-dp[i][lc]*a[i])/b[i]);
}
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]);
}
st=1;
dr=10000;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(ok(mid))
{
sol=mid;
dr=mid-1;
}
else st=mid+1;
}
printf("%d\n",sol);
reconstruieste(sol,n,l);
return 0;
}