Pagini recente » Cod sursa (job #2841258) | Cod sursa (job #3152147) | Cod sursa (job #576494) | Cod sursa (job #374196) | Cod sursa (job #3190933)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,L,a[10001],b[10001],tata[101][101],dp[2][101];
int solve(int val){
memset(tata,0,sizeof(tata));
for(int i = 0; i <= 1; i++)
for(int j = 1;j<=L;j++)
dp[i][j]=-1;
for(int i = 0;i<=L;i++) /// cant de lapte A bauta de prima persoana
if(i*a[1]<=val)
dp[0][i]=(val-i*a[1])/b[1];
int stare = 0;
for(int i = 2; i <=n; i ++ ){
/// d[i][j] cant de lapte b bauta de primii i
/// j = cantintatea a bauta de primii i
stare = 1- stare;
for(int j = 0; j<=L ; j++){
for(int k = 0; k<=j;k++)
if(dp[1-stare][k]!=-1 && (j-k)*a[i]<=val){
/// beau j-k
if(dp[stare][j]<dp[1-stare][k]+(val-(j-k)*a[i])/b[i])
dp[stare][j]=dp[1-stare][k]+(val-(j-k)*a[i])/b[i],tata[i][j]=k;
}
}
}
return dp[stare][L];
}
void refacere(int lin,int col, int T){
if(lin>=1){
refacere(lin-1,tata[lin][col],T);
fout<<col-tata[lin][col]<<" "<<(T-(col-tata[lin][col])*a[lin])/b[lin]<<"\n";
}
}
int main(){
fin>>n>>L;
for(int i=1;i<=n;i++)
fin>>a[i]>>b[i];
int st = 0 , dr = 100;
int best;
while(st<=dr){
int mij = (st+dr)/2;
int ok = solve(mij);
if(ok>=L)
dr=mij-1,best = mij;
else
st = mij +1 ;
}
fout<<best<<'\n';
solve(best);
refacere(n,L,best);
return 0;
}