Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Łączenie liczb
Forum PHP.pl > Forum > Przedszkole
slawo
Witajcie, nie wiem jak zatytułować mój temat. Załóżmy, że mamy klocki z wartościami:

1 / 1,25 / 1,5 / 2 / 2,5 / 3 / 5 / 10 / 15 / 20

Chcę aby skrypt dobrał mi jak najmniejszą ilość klocków aby wyszła wpisana wartość.

Przykład: podaje wartość 18

Chciałbym aby skrypt dobrał: 15 + 3

Błędne: 3 + 5 + 10

Klocki nie mogą się powtarzać: 5 + 5 + 3

Proszę o jakieś wskazówki, nie wiem jak się z to zabrać closedeyes.gif
kpt_lucek
Tworzysz sobie wszystkie możliwe kombinacje liczb, które w efekcie utworzą sumę wymaganą przez Ciebie (bądź sumę która będzie jej najbliższa), do tego zliczasz ilość składników i zwracasz to, co wymagało ich najmniej smile.gif
trueblue
A może tak:
redukujesz tablicę składników do tych mniejszych lub równych szukanej, sortujesz malejąco, dzielisz przez największą i sprawdzasz resztę, jeśli reszta jest większa od 0, to zapisujesz składnik na liście z boku, a dla reszty wykonujesz operację analogiczną jak dla całości.
lustfingers
Jeśli to do zupek amino to jest do tego apka na androida https://play.google.com/store/apps/details?...akalkulator.app

oraz kalkulator do pobrania: http://michalmleczko.waw.pl/kalkulator-wyg...ii-kasa-romana/
noche
ja bym na początek spróbował posortować tablice malejąco
wrzucił do foreach'a coś na zasadzie $value <= $ szukana
Pyton_000
Łopatologiczne smile.gif

  1. <?php
  2.  
  3. $liczby = [1, 1.25, 1.5, 2, 2.5, 3, 5, 10, 15, 20];
  4. $szukana = 18;
  5.  
  6. $wyniki = [];
  7. rsort($liczby);
  8.  
  9. for($i=0, $c=count($liczby); $i<$c; $i++) {
  10. if($liczby[$i] > $szukana){
  11. continue;
  12. }
  13. $wyniki[$i][] = $liczby[$i];
  14.  
  15. if($liczby[$i] == $szukana) {
  16. continue;
  17. }
  18.  
  19. for($j=0; $j<$c; $j++) {
  20. if($j == $i) {
  21. continue;
  22. }
  23. $sum = array_sum($wyniki[$i])+$liczby[$j];
  24. if($sum > $szukana) {
  25. continue;
  26. }
  27. $wyniki[$i][] = $liczby[$j];
  28.  
  29. if($sum == $szukana) {
  30. break;
  31. }
  32.  
  33. }
  34. sort($wyniki[$i]);
  35. }
  36. array_walk($wyniki, function(&$val) {
  37. $val = implode(',', $val);
  38. });
  39.  
  40. $wyniki = array_unique($wyniki);
  41. var_dump($wyniki);
slawo
Nie działa coś ten kod. Nie ukrywam nie poradzę sobie z tym nie mam na tyle wiedzy sad.gif
Pyton_000
A u mnie działa:

Kod
array(5) {
  [1]=>
  string(4) "3,15"
  [2]=>
  string(6) "3,5,10"
  [5]=>
  string(6) "2.5,15"
  [6]=>
  string(6) "1,2,15"
  [7]=>
  string(11) "1.25,1.5,15"
}
slawo
Niby tak ale powinno zwrócić tylko 3+15 (najlepszą opcję). Poza tym niektóre sumy nie dają 18.
Pyton_000
Spoko, zmodyfikuj go sobie o przefiltrowanie wyników i będziesz miał gotowe smile.gif
Puszy
Do użycia funkcja findComponents(), jeżeli możliwa jest kombinacja unikalnych składników zwróci ją lub false w przypadku braku takiej kombinacji. Choć wydaje mi się że skrypt ma wadę bo leci od największych składników przez co nie wszystkie kombinacje są możliwe :/

edit: jednak nie działa w pełni poprawnie, wysypuje się na floatach ale może Cię to na coś naprowadzi, tak na prawdę to potrzebny tu jest jedynie sensowny algorytm, przełożenie go na kod to już formalność.

  1. $acceptable = [1, 1.25, 1.5, 2, 2.5, 3, 5, 10, 15, 20];
  2.  
  3. print_r(findComponents(18, $acceptable));
  4.  
  5. function findComponents($search, $acceptable){
  6. $components = findComponentsR($search, $acceptable);
  7. return array_sum($components) == $search ? $components : false;
  8. }
  9.  
  10. function findComponentsR($search, $acceptable, $originalSearch=null, $components=[]){
  11.  
  12. $components = array_unique($components);
  13.  
  14. if(!is_null($originalSearch) && array_sum($components) == $originalSearch){
  15. return $components;
  16. }
  17.  
  18. rsort($acceptable);
  19.  
  20. foreach ($acceptable as $k => $v) {
  21. if ($v > $search) {
  22. unset($acceptable[$k]);
  23. } elseif($v == $search) {
  24. unset($acceptable[$k]);
  25. return [$v];
  26. }else{
  27. $components[] = $v;
  28. unset($acceptable[$k]);
  29.  
  30. if(!empty($acceptable)) {
  31. $components = array_merge($components, findComponentsR($search - $v, $acceptable, $originalSearch, $components));
  32. break;
  33. }
  34. }
  35. }
  36. return array_unique($components);
  37. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.