Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Jak zwrócić wszystkie kombinacje rozłożenia X osób w Y grupach
radiopraca
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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.

Ten post edytował Kshyhoo 7.02.2014, 20:40:25
Powód edycji: [Kshyhoo]: to Forum nie stosuje takich metod
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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?
Go to the top of the page
+Quote Post
radiopraca
post
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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


Ten post edytował radiopraca 7.02.2014, 20:51:24
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #4





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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);
Powód edycji: [Kshyhoo]:
Go to the top of the page
+Quote Post
radiopraca
post
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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.
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #6





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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 />";
Go to the top of the page
+Quote Post
radiopraca
post
Post #7





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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).
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #8





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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) (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
radiopraca
post
Post #9





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 12:20