przez Jan_J » Wt paź 27, 2009 8:59 pm
Hasło: programowanie dynamiczne
Literatura (o ile nie przestraszy): Banachowski, Diks, Rytter: Algorytmy i struktury danych. Cormen, Leiserson, Rivest, Stein: Wprowadzenie do algorytmów.
Wskazówki:
1. Uporządkuj swoje liczby od największej do najmniejszej, pomijając zera. Sprawdź, ile największych składników musisz dodać, by osiągnąć lub przekroczyć wymaganą sumę.
Twój zbiór musi się składać z co najmniej tylu liczb. Niech to będzie N.
(Sumując liczby ,,od końca'' dostaniesz górne oszacowanie ilości niezbędnych składników. Niech to będzie NMax. Przyda się tylko do szacowania ilości podzbiorów.)
2. Wygeneruj (zapamiętując je w jakiejś strukturze) wszystkie podzbiory N-elementowe, sprawdzaj ich sumy. Jak się zgodzi z wymaganiem, to koniec.
3. Jeżeli żadna suma się nie zgodzi, łącz posiadane podzbiory w większe, sprawdzając ich sumy i zapamiętując na przyszłość te, które nie dają zbyt dużej sumy. A jak któraś suma się zgodzi, to koniec.
(Po drodze są delikatne momenty: 1. łączone podzbiory mogą mieć część wspólną, 2. jak nie pomieszać ze sobą starych i nowych podzbiorów, 3. jak uniknąć powtórzeń połączonych podzbiorów). Rob to tak długo, aż nie trafisz lub aż na danym ,,piętrze'' podzbiorów nie dostaniesz tylko za dużych sum (tj. lista ,,obiecujących'' podzbiorów się opróżni).
4. Jeżeli żaden sprawdzony podzbiór nie miał dokładnie takiej sumy jaką chcesz, to znaczy że takiego podzbioru nie ma. Też koniec.
Z wyjątkiem bardzo krótkich ciągów liczb, problem jest zbyt poważny, by atakować go arkuszem. Wymaga programowania.
Zgrubne (na ogół pesymistyczne) szacowanie ilości operacji dostaniesz sumując liczbę wszystkich podzbiorów K-elementowych, gdzie K zmienia się do N do NMax.
Realnych czas wykonania bywa bardzo rozmaity. Dla 500 losowo wybieranych liczb z przedziału od 0 do 100, i dla sumy 10000, dostaję w interpreterze na ogół czasy rzędu od kilku do kilkudziesięciu sekund (co oznacza, że rozwiązanie znaleziono gdzieś w drugiej lub na początku trzeciej fazy algorytmu). Oczywiście, dla szczególnych danych może też być dużo gorzej. I bywa -- bo faza trzecia może wymagać przejrzenia wielkiej liczby podzbiorów. Bywa też, że rozwiązanie nie istnieje.
JJ
OOo 3.1.x && Python 2.x && Unicode 5.x && LaTeX 2ε && XML 1.x && Unix tools && Linux 2.6.x # kolejność nieistotna