Pagini recente » Cod sursa (job #1240909) | Cod sursa (job #1262124) | Cod sursa (job #1088532) | Cod sursa (job #99693) | Cod sursa (job #2918295)
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <deque>
using namespace std;
vector<pair<int,int>>a;
vector<int>b;
vector<pair<int,int>>v;
int n,k,l;
int ok(int x)
{
vector<int>dp(k+1,-2e9);
dp[0]=0;
for(const auto &c:a)
{
vector<int>_dp=dp;
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;i--)
{
if(j<i)
{
if(_dp[i-j]+rest>dp[i])
{
dp[i]=_dp[i-j]+rest;
}
}
else
{
if(_dp[0]+rest>dp[i])
{
dp[i]=rest+_dp[0];
}
}
}
j++;
}
}
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;
}
int dp[101][101];
pair<int,int> sol[101][101];
void rec(int answer) {
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= l; j++) {
dp[i][j] = -2e9;
}
}
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= l; j++) {
for (int c = 0; c * a[i-1].first <= answer && c <= j; c++) {
int rem = answer - a[i-1].first * c;
if (dp[i][j] < dp[i - 1][j - c] + rem / b[i-1]) {
dp[i][j] = dp[i - 1][j - c] + rem / b[i-1];
sol[i][j] = {c, rem / b[i-1]};
}
}
}
}
for (int i = n; i >= 1; i--) {
v.push_back(sol[i][l]);
l -= sol[i][l].first;
}
}
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;
}
l=k;
for(int i=0;i<n;i++)
{
b.push_back(a[i].second);
}
int rez=caut();
cout<<rez<<'\n';
rec(rez);
reverse(v.begin(),v.end());
for(auto &c:v)
{
cout<<c.first<<' '<<c.second<<'\n';
}
}