Pagini recente » Cod sursa (job #1918246) | Cod sursa (job #1340556) | Cod sursa (job #3126233) | Cod sursa (job #867975) | Cod sursa (job #592834)
Cod sursa(job #592834)
#include<stdio.h>
#include<string.h>
#include<set>
using namespace std;
#define pi pair<int,int>
#define x first
#define y second
#define NMAX 105
#define INF 1000000005
int d[NMAX][NMAX],L,n,sol;
int pred[NMAX][NMAX],predc[NMAX][NMAX];
pi v[NMAX];
int merge(int timp)
{
if(timp<0)
return 0;
int i,j,k,lb;
memset(d,0,sizeof(d));
for(j=0;j<=n;j++)
for(i=0;i<=L;i++)
d[j][i]=-INF;
d[0][0]=0;
for(i=1;i<=n;i++)
for(j=0;j<=L;j++)
for(k=0;k<=j && k*v[i].x<=timp;k++)
{
lb=(timp-k*v[i].x)/v[i].y;
if(d[i][j]<d[i-1][j-k]+lb)
{
d[i][j]=d[i-1][j-k]+lb;
predc[i][j]=k;
}
}
return d[n][L]>=L;
}
void recur(int poz,int cant)
{
if(!poz)
return ;
recur(poz-1,cant-pred[poz][cant]);
printf("%d %d\n",pred[poz][cant],(sol-v[poz].x*pred[poz][cant])/v[poz].y);
}
int main ()
{
int i,j,st,dr,mij;
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=200000;
while(st<=dr)
{
mij=(st+dr)/2;
if(merge(mij))
{
sol=mij;
dr=mij-1;
for(i=1;i<=n;i++)
for(j=1;j<=L;j++)
pred[i][j]=predc[i][j];
}
else
st=mij+1;
}
printf("%d\n",sol);
recur(n,L);
return 0;
}