Pagini recente » Istoria paginii utilizator/cosminbbx | Diferente pentru reguli intre reviziile 13 si 12 | Istoria paginii runda/codebreaking_2 | Istoria paginii utilizator/andrus | Cod sursa (job #2491036)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
pair<int, int> v[103];
int n;
int dp[103][103], l;
pair<int, int> dpp[103][103];
bool getdp(int t){
for(int i=0;i<=n;++i)
for(int j=0;j<=l;++j) dp[i][j]=-(1<<30);
dp[0][0]=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=l;++j){
for(int k=j;k>=0;--k){
int d=(j-k)*v[i].second;
if(d>t) k=-1;
else if(dp[i][j]<dp[i-1][k]+(t-d)/v[i].first){
dp[i][j]=dp[i-1][k]+(t-d)/v[i].first;
dpp[i][j]=make_pair((t-d)/v[i].first, j-k);
}
}
}
}
if(dp[n][l]>=l) return 1;
return 0;
}
void show(int i, int j){
if(i!=1) show(i-1, j-dpp[i][j].second);
fout<<dpp[i][j].first<<" "<<dpp[i][j].second<<"\n";
}
int main(){
fin>>n>>l;
for(int i=1;i<=n;++i){
fin>>v[i].first>>v[i].second;
}
int st=1, dr=103, sol=dr;
while(st<=dr){
if(getdp((st+dr)/2)) sol=(st+dr)/2, dr=(st+dr)/2-1;
else st=(st+dr)/2+1;
}
getdp(sol);
fout<<sol<<"\n";
show(n, l);
return 0;
}