Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak zwrócić wszystkie kombinacje rozłożenia X osób w Y grupach
Forum PHP.pl > Forum > Przedszkole
radiopraca
Witam serdecznie,

Siedzę od kilku godzin na pewnym skryptem, ale bez skutecznie więc postanowiłem poprosić o pomoc ekspertów.

Chciałbym napisać funkcję która zwróci mi wszystkie możliwe kombinacje rozłożenia X osób w Y grupach.
Funkcja musiałaby być uniwersalna i obsługiwać dowolne wartości X i Y.

Na przykład: 3 osoby można rozłożyć w 2 grupach na 8 sposobów:
0, 123 (0 osób w pierwszej grupie, osoby: 1, 2 i 3 w drugiej grupie)
1,23 (Osoba: 1 w pierwszej grupie, osoby 2 i 3 w drugiej grupie)
2,13
3,12
12,3
13,2
23,1
123,0

(...)

Kodu właśnie nie mam jeszcze bo nie wiem jak się za to zabrać.
Myślałem coś o rekurencji, ale nie mam pojęcia jak zacząć.
Nie proszę o gotowe rozwiązanie, tylko o jakieś naprowadzenie jak to zrobić.

Wszystkich kombinacji jest: pow(Y, X) czyli Y do potęgi X.
Kshyhoo
Pokaż swój kod, takie panują tu zasady. Dodaj też tagi do tematu.

Nie dopisuj się do posta, tylko użyj opcji "odpowiedz". Skąd bierzesz dane? Formularz, plik, baza danych?
radiopraca
Dane pochodzą z wcześniejszych obliczeń. Dokładnie problem dotyczy tego że:
Mam X hurtowni (np. 2) i Y towarów do kupienia (np. 3) no i muszę obliczyć gdzie najbardziej opłaca mi się zrobić zakupy.
W jakiej hurtowni muszę kupić jaki towar. Np. kup z hurtowni A towar 1 i 2, a w hurtowni B towar 3.

Znam liczbę hurtowni, np.: $wholesalesCounter = 2; i ID produktów: $products = array(1, 2);

No i w tym przypadku funkcja powinna zwrócić:

0 # 1 i 2
1 # 2
2 # 1
1 i 2 # 0
Kshyhoo
Lukaj i dostosuj do swoich potrzeb.
  1. $products = explode(',', 'a,b,c');
  2. $wholesalesCounter = 2;
  3.  
  4. function policz($nr) {
  5. global $wholesalesCounter, $products, $ciag;
  6. for($i=0; $i<count($products ); $i++) {
  7. $ciag[$nr] = $products[$i];
  8. if ($nr<$wholesalesCounter-1) policz($nr+1);
  9. if ($nr==$wholesalesCounter-1) echo implode(', ',$ciag)."<br />";
  10. }
  11. }
  12. policz(0);
radiopraca
Dzieki kolego, ale próbuje to przerabiać i nic.
Wykonałem ten Twój kodzik na serwerze i zwraca on:
a,a
a,b
b,a
b,b

czyli kombinacje każdy z każdym z powtórzeniami.
W mojej sytuacji nie może być powtórzeń a dla "a,b,c" musi zwrócić również coś takiego:
abc,-
ab,c
ac,b
a,bc
itd.
Kshyhoo
A tak:
  1. function kombinacje($tekst, $k) {
  2. for ($i=0;$i<$k;$i++) $t[$i]=$i;
  3. $t[$k-1]--;
  4. do {
  5. if ($t[$k-1]>=strlen($tekst)-1) {
  6. for ($j=0;$j<$k;$j++) {
  7. if ($t[$j]>=strlen($tekst)-$k+$j) {$t[$j-1]++; $t[$j]=$t[$j-1];}
  8. }
  9. }
  10. $t[$k-1]++;
  11. $kombinacja="";
  12. for ($j=0;$j<$k;$j++) $kombinacja.= $tekst[$t[$j]];
  13. $tmp[]=$kombinacja;
  14. } while ($t[0]<>strlen($tekst)-$k);
  15. echo $l;
  16. return $tmp;
  17. }
  18.  
  19. $wynik = kombinacje("1234567890",5);
  20. $ile = count($wynik);
  21. echo "ILE: $ile<br />";
  22. for ($i=0;$i<$ile;$i++) echo $wynik[$i]."<br />";
radiopraca
Też nie do konca.

Dla: kombinacje("abc", 2);

Zwraca:
ILE: 3
ab
ac
bc

Poprawny skrypt powinien zawsze w każdym wierszu wyniku, zwracać (a,b i c) w róznych kombinacjach.
Zawsze chcemy kupić wszystkie (3) produkty a nie tylko 2 (a i b czy b i c).
Kshyhoo
No bo zwraca kombinacje 2 danych wejściowych. Powinieneś użyć kombinacje("abc", 3), czyli 3 kombinacje 3 danych (3 artykuły z 3 hurtowni) tongue.gif
radiopraca
Przerobiłem i działa. Efekt: Kombinacje abc

Dla 'ab' zrobiłem array_diff(abc, ab) i zwrciło to co pozostało i działa.
Jeszcze trochę doszlifuję i dam skrypcik.
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.