radiopraca
7.02.2014, 20:30:30
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
7.02.2014, 20:39:16
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
7.02.2014, 20:44:33
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
7.02.2014, 20:59:32
Lukaj i dostosuj do swoich potrzeb.
$wholesalesCounter = 2;
function policz($nr) {
global $wholesalesCounter, $products, $ciag; for($i=0; $i<count($products ); $i++) {
$ciag[$nr] = $products[$i];
if ($nr<$wholesalesCounter-1) policz($nr+1);
if ($nr==$wholesalesCounter-1
) echo implode(', ',$ciag)."<br />"; }
}
policz(0);
radiopraca
7.02.2014, 21:49:11
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
7.02.2014, 21:53:27
A tak:
function kombinacje($tekst, $k) {
for ($i=0;$i<$k;$i++) $t[$i]=$i;
$t[$k-1]--;
do {
if ($t[$k-1
]>=strlen($tekst)-1
) { for ($j=0;$j<$k;$j++) {
if ($t[$j]>=strlen($tekst)-$k+$j) {$t[$j-1
]++; $t[$j]=$t[$j-1
];} }
}
$t[$k-1]++;
$kombinacja="";
for ($j=0;$j<$k;$j++) $kombinacja.= $tekst[$t[$j]];
$tmp[]=$kombinacja;
} while ($t[0]<>strlen($tekst)-$k);
return $tmp;
}
$wynik = kombinacje("1234567890",5);
for ($i=0;$i<$ile;$i++) echo $wynik[$i]."<br />";
radiopraca
7.02.2014, 22:12:11
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
7.02.2014, 22:25:47
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)
radiopraca
7.02.2014, 22:36:09
Przerobiłem i działa. Efekt:
Kombinacje abcDla '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.