Pagini recente » Cod sursa (job #374614) | Cod sursa (job #1815044) | Cod sursa (job #295631) | Cod sursa (job #1290789) | Cod sursa (job #2751292)
#include <iostream>
#include <fstream>
#define NMAX 100
#define LMAX 100
#define INFINIT 10000
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int N, L;
int rsp[NMAX + 1][LMAX + 1];
struct persoana{
int A, B;
}timp[NMAX + 1];
struct repartizare{
int A, B;
}cantitate[NMAX + 1][LMAX + 1];
int valid(int TIMP){
for(int i = 0; i <= N; i++){
for(int cantA = 0; cantA <= L; cantA++){
rsp[i][cantA] = -INFINIT;
}
}
rsp[0][0] = 0;
for(int i = 1; i <= N; i++){
for(int cantA = 0; cantA <= L; cantA++){
for(int cantAadd = 0; cantAadd <= cantA && cantAadd * timp[i].A <= TIMP; cantAadd++){
int cantBadd = (TIMP - cantAadd * timp[i].A) / timp[i].B;
int candidat = rsp[i - 1][cantA - cantAadd] + cantBadd;
if(candidat > rsp[i][cantA]){
rsp[i][cantA] = candidat;
for(int k = 1; k <= i - 1; k++){
cantitate[k][cantA].A = cantitate[k][cantA - cantAadd].A;
cantitate[k][cantA].B = cantitate[k][cantA - cantAadd].B;
}
cantitate[i][cantA].A = cantAadd;
cantitate[i][cantA].B = cantBadd;
}
}
}
}
return rsp[N][L] >= L;
}
int main()
{
fin >> N >> L;
for(int i = 1; i <= N; i++){
fin >> timp[i].A >> timp[i].B;
}
int left = 0;
int right = 100 * 100 + 1;
while(right - left > 1){
int mid = (left + right) / 2;
if( valid(mid) ){
right = mid;
}
else {
left = mid;
}
}
//raspunsul se afla in right
fout << right << "\n";
valid(right);
for(int i = 1; i <= N; i++){
fout << cantitate[i][L].A << ' ' << cantitate[i][L].B << "\n";
}
return 0;
}