Prin backtracking inteleg acele metode in care incerci solutii si apoi le verifici.
Da, iei pe rand fiecare combinatie posibila de numere. Insa, pentru a afisa in ordine crescatoare dupa S si pentru a evita solutiile invalide apar niste complicatii.
O metoda ar fi sa faci pentru toate S-urile un back(int k, int sum, int sum_now) (k ii pozitia curenta pentru care generezi, sum ii suma la care vrei sa se ajunga, sum_now ii suma curenta a numerelor pana la pozitia k-1, inclusiv)
De asemenea, retinerii sumei partiale pentru fiecare element ajuta pentru calcularea mai rapida. (sp[ i ] = sp[ i-1 ] + a[ i ])
pentru fiecare pozitie k va fi un for in care se testeaza elementele:
void back(int k, int sum, int sum_now) {
for(int i = max (0, sum - sum_now - (sp[ m ] - sp[ k ]); i <= min(sum - sum_now, a[ k ]); ++i) {
v[ k ] = i;
back(k+1, sum, sum_now + i);
}
}
max (0, sum - sum_now - (sp[ m ] - sp[ k ]) - verifica cazul in care toate elementele de la k+1 pana la m vor fi maxime, astfel incat sa se evite problema solutiilor invalide (in care suma obinuta in back e mai mica decat ar trebui sa fie)
Nu ar trebui sa se obtina nici duplicate, nici solutii invalide cand ajungi la k maxim.
Nu. Problema nu e din ceva concurs, e din viata reala, deci putem fi flexibili.
Orice alta precizare poate modifica radical algoritmul, inclusiv ordinea aceea cand S-urile sunt egale.