kurkusmaximus
19.09.2010, 21:48:53
Mam tablicę z ileś tam liczbami, np: 2, 465, 22, 35.86, 23.84, 1000
Muszę wypisać wszystkie możliwe sumy uzyskane przez dodanie n liczby elementów z tablicy.
Macie na to jakiś pomysł?
flashdev
19.09.2010, 22:11:30
http://pl.wikipedia.org/wiki/Wariacja_bez_powtórzeńTo jest to czego szukasz. Wystarczy znaleźć odpowiedni kod w interneci i przerobić tak, aby elementy zbioru były sumowane.
kurkusmaximus
20.09.2010, 16:05:47
Dzięki @flashdev, a teraz inna sprawa.
Mam "worek" z liczbami. Jak znaleźć składniki, które po dodaniu dadzą określoną sumę.
Np: w worku mam 100, 500, 400, 250, 700; użytkownik chce znaleźć składniki, które dadzą sumę 1000.
wszerad
20.09.2010, 17:06:51
Kod
var tablica = [100, 500, 400, 250, 700];
tablica = tablica.sort;
for(i=0;i<tablica.length;i++){
for(j=1+i;j<tablica.length;j++){
if(tablica[i]+tablica[j]==1000){
alert('x='+tablica[i]+'y='+tablica[j]);
}
}
}
Tu masz dla sumy dwóch elementów jeżeli więcej to już trochę więcej myślenia.
flashdev
20.09.2010, 17:57:51
Cytat(wszerad @ 20.09.2010, 18:06:51 )

Ten kod nigdy się nie przyda, bo nie wiesz jak duża będzie tablica.
Tutaj z kolei przyda się wiedza o kombinacjach bez powtórzeń.
Przy długości tablicy równej "n" musisz wygenerować "n" tablic kombinacji, gdzie "i"-ta tablica zawiera kombinacje "i"-elementowe, ze zbioru "n"-elementowego.
Mając te tablice, a anajlepiej odrazu sumy poszczególnych elementów sprawdasz która suma równa jest sumie szukanej i do wyniku dopisujesz (push) odpowiednią tablicę.
wszerad
21.09.2010, 17:58:55
To zależy od ilości elementów tablicy, którą przecież trzeba i tak zdefiniować... Dzięki tablica.length pętla będzie się wykonywać przez wszystkie elementy. Chyba ,że tak jak napisałem wcześniej suma będzie nie tylko dwóch elementów.
kurkusmaximus
23.09.2010, 18:10:39
A więc popełniłem takie coś:
Odwiedź moją stronęSkrypt dobrze działa tylko do 4 podanych liczb...
---------------
Nie rozumiem Twojego wyjaśnienia problemu flashdev.
Tak wiem, wystawiam Twoją cierpliwość na próbę, ale czy możesz przedstawić gotową funkcję?
flashdev
23.09.2010, 18:37:54
Wytłumacze na przykadzie.
Dane:
tablica: [1, 2, 3, 4, 5, 6] (size = 6)
suma: 10
Szuakne: (array)wynik
teraz robisz petle po N od 1 do size (6)
oblicz wszystkie kombinacje bez powtorzen
przyklady:
Dla N = 1 wynikiem jest tablica jednoelementowych kombinacji:
[1, 2, 3, 4, 5, 6]
Dla N = 2 wynikiem jest tablica dwuelementowych kombinacji:
[[1, 2], [1, 3], ..., [1, 6], [2, 1], [2, 3], ..., [5, 6]];
przechodzisz w petli przez wszystkie el. tej tablicy i sprawdzasz:
jesli suma elementow podtablicy jest rowna szukanej sumie
array_push(wynik, tablica[i]); // dodajesz ta tablice do wyniku
end if
koniec petli
To by było na tyle. Mam andzieję, że rozwiałem Twoje wątpliwości co do algorytmu.