Pagini recente » Cod sursa (job #2603111) | Cod sursa (job #995578) | Cod sursa (job #254075) | Cod sursa (job #584896) | Cod sursa (job #1613371)
#include <cstdio>
#define NMAX 105
using namespace std;
int n,i,l,sol,st,dr,mij,ok;
int c[105][105];
struct punct
{
int x,y;
}v[NMAX];
int dp[105][105];
bool Solutie(int T)
{
int i,j,k;
for(i=0;i<=n;++i)
for(j=0;j<=l;++j) dp[i][j]=-101;
dp[0][0]=0;
for(i=1;i<=n;++i)
for(k=0;k<=l;++k)
for(j=0;j*v[i].x<=T;++j)
{
if(dp[i][k] < dp[i-1][k-j] + (T-j*v[i].x)/v[i].y)
{
dp[i][k]=dp[i-1][k-j] + (T-j*v[i].x)/v[i].y;
c[i][k]=j;
}
}
if(dp[n][l] >= l) return 0;
else return 1;
}
void afis(int x, int y, int z)
{
if(x!=0)
{
afis(x-1,y-c[x][y],y);
printf("%d %d\n",c[x][y],(sol-c[x][y]*v[x].x)/v[x].y);
}
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
for(i=1;i<=n;++i)
scanf("%d%d",&v[i].x,&v[i].y);
st=1;dr=100;
while(st <= dr)
{
int mij=(st+dr)/2;
ok = Solutie(mij);
if( ok == 0) {dr=mij-1;sol=mij;}
else st=mij+1;
}
printf("%d\n",sol);
afis(n,l,sol);
return 0;
}