Donats dos naturals i i un vector d’ naturals, es vol trobar quina és el mínim del màxim de les sumes dels trossos de quan aquest és tallat en trossos.
Per exemple: Considereu i . Hi ha tres maneres de tallar en trossos: , i . En el primer cas, el primer tros suma 12 i el segon suma 191. Per tant el màxim de les sumes és 191. Pel segon cas el màxim de les sumes és 157, i pel tercer cas el màxim de les sumes és 113. Per tant, el mínim dels màxims de les sumes és 113.
Resoleu el problema en tres passos:
Primer, escriviu una funció
bool has_max_sum(const vector<int>& v, int m, int x)
que indiqui si es pot tallar
en
trossos de forma que el màxim de les sumes dels trossos sigui
o menys.
Després, escriviu una funció
int min_max_sum(const vector<int>& v, int m) que
retorni el mínim dels màxims de les sumes de
en
trossos utilitzant has_max_sum astutament.
Finalment, descriviu en un comentari a l’inici del programa quina és l’estratègia del vostre algorisme i quin és el seu cost.
Descarregueu el fitxer code.cc per trobar l’esquelet del
codi i el comentari i la implementació del programa principal. Podeu
assumir que
, i que
,
la suma dels elements del vector, cap en un int.
Input
2 4 12 34 67 90 2 4 90 12 34 67 2 5 13 43 65 87 92 3 3 4 6 5 2 2 1 999999999 1 1 3
Output
113 102 179 6 999999999 3