Pagini recente » Cod sursa (job #861958) | Cod sursa (job #2947478) | Cod sursa (job #2576136) | Cod sursa (job #534022) | Cod sursa (job #2918286)
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <deque>
#import <cassert>
using namespace std;
vector<pair<int,int>>a;
vector<int>sol;
int n,k,l;
int ok(int x)
{
vector<int>dp(k+1,-2e9);
dp[0]=0;
vector<vector<int>>h(k+1);
for(auto &c:h)
{
c.resize(n);
}
int nvm=0;
for(const auto &c:a)
{
vector<int>_dp=dp;
vector<vector<int>>_h=h;
dp=vector<int>(k+1,0);
int j=0;
while(c.first*j<=x)
{
int rest=(x-c.first*j)/c.second;
for(int i=k;i>=0;i--)
{
if(j<i)
{
if(_dp[i-j]+rest>dp[i])
{
dp[i]=_dp[i-j]+rest;
h[i]=_h[i-j];
h[i][nvm]=j;
}
}
else
{
if(_dp[0]+rest>dp[i])
{
dp[i]=rest+_dp[0];
h[i]=_h[0];
h[i][nvm]=j;
}
}
}
j++;
}
nvm++;
}
if(dp[k]>=k)
{
sol=h[k];
return 1;
}
return 0;
}
int caut()
{
int rez=-1,st=1,dr=100;
while(st<=dr)
{
int m=(st+dr)/2;
if(ok(m))
{
dr=m-1;
rez=m;
}
else
{
st=m+1;
}
}
return rez;
}
main()
{
ifstream cin("lapte.in");
ofstream cout("lapte.out");
cin>>n>>k;
a.resize(n);
for(int i=0;i<n;i++)
{
cin>>a[i].first>>a[i].second;
}
int rez=caut();
cout<<rez<<'\n';
for(int i=0;i<n;i++)
{
int c=sol[i];
cout<<c<<' '<<(rez-c*a[i].first)/a[i].second<<'\n';
}
}