Pagini recente » Cod sursa (job #652690) | Cod sursa (job #127296) | Cod sursa (job #1228413) | Cod sursa (job #854370) | Cod sursa (job #3255924)
#include <bits/stdc++.h>
#define VMAX 100000
#define NMAX 100
#define LOG 30
#define INF (long long)(1e9)
#define MOD 1000000007
#define ll long long int
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
pair<int,int> dp[NMAX+1][NMAX+1];
int a[NMAX+1],b[NMAX+1];
int n,l;
bool check(int m)
{
for(int i=1;i<=l;i++)
{
dp[0][i]={-INF,0};
}
dp[0][0] = {0,0};
for(int i=1;i<=n;i++)
{
for(int j=0;j<=l;j++)
{
dp[i][j] = {-INF,0};
for(int j1=0;j1<=j && j1*a[i]<=m;j1++)
{
if(dp[i][j].first < dp[i-1][j-j1].first + (m-j1*a[i])/b[i])
{
dp[i][j].first = dp[i-1][j-j1].first + (m-j1*a[i])/b[i];
dp[i][j].second = j1;
}
}
}
}
return dp[n][l].first>=l;
}
int main()
{
/// dp[A] = nr maxim de B cand am baut A
fin >> n >> l;
for(int i=1;i<=n;i++)
{
fin >> a[i] >> b[i];
}
int st=1,dr=100;
while(st<=dr)
{
int m = (st+dr)/2;
if(check(m))
{
dr=m-1;
}
else
{
st=m+1;
}
}
fout << st << '\n';
int m = st;
for(int i=1;i<=l;i++)
{
dp[0][i]={-INF,0};
}
dp[0][0] = {0,0};
for(int i=1;i<=n;i++)
{
for(int j=0;j<=l;j++)
{
dp[i][j] = {-INF,0};
for(int j1=0;j1<=j && j1*a[i]<=m;j1++)
{
if(dp[i][j].first < dp[i-1][j-j1].first + (m-j1*a[i])/b[i])
{
dp[i][j].first = dp[i-1][j-j1].first + (m-j1*a[i])/b[i];
dp[i][j].second = j1;
}
}
}
}
vector<int> res;
int curr=l;
for(int i=n;i>=1;i--)
{
res.push_back(dp[i][curr].second);
curr = curr - dp[i][curr].second;
}
reverse(res.begin(),res.end());
for(int i=0;i<res.size();i++)
{
fout << res[i] << " " << (m-res[i]*a[i+1])/b[i+1] << "\n";
}
}