Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Łączenie liczb
slawo
post 21.09.2016, 19:02:00
Post #1





Grupa: Zarejestrowani
Postów: 184
Pomógł: 0
Dołączył: 11.01.2010
Skąd: Nowa Dęba

Ostrzeżenie: (0%)
-----


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


--------------------
zpodziemia.pl - największa baza dobrych nielegali w POLSCE!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
kpt_lucek
post 21.09.2016, 19:12:29
Post #2





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
trueblue
post 21.09.2016, 19:41:00
Post #3





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 22.09.2016, 04:37:32
Post #4





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


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/

Ten post edytował lustfingers 22.09.2016, 04:39:23
Go to the top of the page
+Quote Post
noche
post 22.09.2016, 07:31:57
Post #5





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 20.02.2015

Ostrzeżenie: (0%)
-----


ja bym na początek spróbował posortować tablice malejąco
wrzucił do foreach'a coś na zasadzie $value <= $ szukana
Go to the top of the page
+Quote Post
Pyton_000
post 22.09.2016, 09:13:35
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ł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);
Go to the top of the page
+Quote Post
slawo
post 22.09.2016, 18:58:00
Post #7





Grupa: Zarejestrowani
Postów: 184
Pomógł: 0
Dołączył: 11.01.2010
Skąd: Nowa Dęba

Ostrzeżenie: (0%)
-----


Nie działa coś ten kod. Nie ukrywam nie poradzę sobie z tym nie mam na tyle wiedzy sad.gif


--------------------
zpodziemia.pl - największa baza dobrych nielegali w POLSCE!
Go to the top of the page
+Quote Post
Pyton_000
post 23.09.2016, 07:07:20
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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"
}
Go to the top of the page
+Quote Post
slawo
post 23.09.2016, 19:59:11
Post #9





Grupa: Zarejestrowani
Postów: 184
Pomógł: 0
Dołączył: 11.01.2010
Skąd: Nowa Dęba

Ostrzeżenie: (0%)
-----


Niby tak ale powinno zwrócić tylko 3+15 (najlepszą opcję). Poza tym niektóre sumy nie dają 18.


--------------------
zpodziemia.pl - największa baza dobrych nielegali w POLSCE!
Go to the top of the page
+Quote Post
Pyton_000
post 23.09.2016, 20:06:16
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Spoko, zmodyfikuj go sobie o przefiltrowanie wyników i będziesz miał gotowe smile.gif
Go to the top of the page
+Quote Post
Puszy
post 30.09.2016, 15:03:29
Post #11





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował Puszy 30.09.2016, 15:17:09
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:29