Byłbym wdzięczny, gdyby ktoś powiedział mi, czy ułożony przeze mnie algorytm jest poprawny oraz, jak zrealizować implementacyjnie optymalną listę cięć. Treść zadania jest następująca:
Proces cięcia belki na dwie krótsze części wymaga podniesienia tej belki, co jest pracą. Praca ta jest wprost proporcjonalna do długości kawałka. Ułóż algorytm tak, żeby pociąć belkę na daną ilość równych kawałków przy jak najmniejszej możliwej pracy (podnoszenie belki). Na wejściu dostajemy długość belki i liczbę równych kawałków na które mamy ja pociąć. Na wyjściu powinniśmy otrzymać całkowitą ilość wykonanej pracy oraz listę kolejności wykonywania cięć.
Mój algorytm:
int M; // liczba równych kawałków
int W[M+1] //minimalna praca dla danej długości belki liczonej w liczbie równych kawałków
W[0] = W[1] = 0;
for (int i = 2; i <=M; i++) W[i] = INT_MAX;
for(int d = 2; d <= M; d++){ // d - długość belki liczona w liczbie równych kawałków
for(int k = 1; k < d; k++){ // k - miejsce cięcia
int curWork = W[d-k] + W[k] + work(d);
W[d] = min(W[d], curWork);
}
}
return W[M];