Pagini recente » Cod sursa (job #2999146) | Cod sursa (job #1624521) | Cod sursa (job #749560) | Cod sursa (job #76892) | Cod sursa (job #2959346)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int ans[105][105];
int nrpers,cantminim;
int a[101],b[101];
int timp_presupus;
int tfinal;
int dp[101][101];///primele i persoane beau j litri de lapte a,unde dp[i][j] e cant max lapte b
void find_way_back(int i,int j)
{
if(i==0)
return;
find_way_back(i-1,j-ans[i][j]);
out<<ans[i][j]<<' '<<(tfinal-a[i]*ans[i][j])/b[i]<<'\n';
};
bool posibil(int t)
{
for(int i=0; i<=nrpers; i++)
for(int j=0; j<=cantminim; j++)
dp[i][j]=-2000000000;
dp[0][0]=0;
for(int i=1; i<=nrpers; i++)
for(int j=0; j<=cantminim; j++)
for(int a1=0; a1<=j; a1++)
{
if(a[i]*a1<=t)
{
if( dp[i][j] < (dp[i-1][j-a1]+((t-a[i]*a1)/b[i])) )
{
dp[i][j]=(dp[i-1][j-a1]+((t-a[i]*a1)/b[i]));
ans[i][j]=a1;
}
}
}
if(dp[nrpers][cantminim]>=cantminim)
return 1;
return 0;
}
int cb(int st,int dr)
{
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(posibil(mij)==1)
{
dr=mij-1;
tfinal=mij;
}
else
st=mij+1;
}
return tfinal;
}
int main()
{
in>>nrpers>>cantminim;
for(int i=1; i<=nrpers; i++)
in>>a[i]>>b[i];
timp_presupus=10000;
out<<cb(1,timp_presupus)<<'\n';
find_way_back(nrpers,cantminim);
return 0;
}