Pagini recente » Cod sursa (job #1227123) | Cod sursa (job #1100348) | Cod sursa (job #2353655) | Cod sursa (job #1205146) | Cod sursa (job #2133343)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[105],b[105];
int dp[105][105][105],t,u,u2;
pair<int,int>sol[105],sol2[105];
int transpose(){
int i;
for(i=1;i<=u;i++)
sol2[i]=sol[i];
u2=u;}
int eval(int n,int l1,int l2){
if (dp[n][l1][l2]!=0)
return dp[n][l1][l2];
if (n==1){
if (l1*a[1]+l2*b[1]<=t){
sol[++u].first=l1,sol[u].second=l2;
dp[n][l1][l2]=1;
return 1;}
else{
dp[n][l1][l2]=-1;
return -1;}}
int i,j;
for(i=0;a[n]*i<=t && i<=l1;i++)
for(j=0;a[n]*i+b[n]*j<=t && j<=l2;j++)
if (eval(n-1,l1-i,l2-j)==1){
sol[++u].first=i;
sol[u].second=j;
dp[n][l1][l2]=1;
return 1;}
dp[n][l1][l2]=-1;
return -1;}
int main(){
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
int n,l,i,st,dr,mij,last;
scanf("%d%d",&n,&l);
for(i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
st=1;
dr=100;
while(st<=dr){
mij=(st+dr)/2;
t=mij;
memset(dp,0,sizeof(dp));
u=0;
eval(n,l,l);
if (dp[n][l][l]==1){
last=mij;
transpose();
dr=mij-1;}
else
st=mij+1;}
printf("%d\n",last);
for(i=1;i<=u2;i++)
printf("%d %d\n",sol2[i].first,sol2[i].second);
return 0;}