Nie, z tego co wiem jest w puli pewna ilość niepodzielnych przez 11 liczb. Z tym że nie ma ich dużo. Zresztą jak sam widzisz ;) U Ciebie to są tylko 333 i 3694 (o ile nie ma błędu).
Ale nawet jeśli szanse są znikome i nie ma sensu liczenie na wygraną, to imo ma sens rozwiązanie ciekawego problemu algorytmicznego :) Choćby dla poćwiczenia sobie.
W powyższym przykładzie masz na razie tylko 25 różnych kodów więc jeszcze nie jest tak tragicznie. Ponieważ jednak ilość wszystkich kombinacji takich liczb rośnie wykładniczo wraz ze wzrostem ilości kodów, to myślę, że rozpatrywanie wszystkich kombinacji szybko robiłoby się coraz bardziej kłopotliwe. Można jednak zauważyć, że znaczna większość takich kombinacji daje wyniki o wiele za duże niż chcielibyśmy uzyskać, więc raczej nie ma sensu rozpatrywać ich wszystkich. I ponieważ większość kodów to dość duże liczby rzędu tysięcy lub setek, to w praktyce znaczna większość kombinacji dających wyniki nie większe od 10000 będzie się składać z nie więcej niż 15 różnych wyrazów (i tak pewnie to jest grube przeszacowanie).
No to wróćmy do mojego poprzedniego algorytmu, który wyodrębnił liczby (zbiór C), dla których istnieje w ogóle szansa by złożyć je z pozostałych liczb podzielnych przez 11
c.d:
5) Uporządkujmy pozostałe kody (te podzielne przez 11) w kolejności malejącej. Ich ilość oznaczmy przez M.
6) Teraz po kolei dla każdej z liczb ze zbioru C utwórzmy drzewo, takie, którego korzeń będzie miał wartość równą danemu elementowi ze zbioru C (liczbie którą chcemy uzyskać). Każdy węzeł tego drzewa będzie zawierał maksymalnie M potomków, oraz zawierał informację o aktualnie dodanym kodzie (k), i reszcie jaką należy jeszcze "dołożyć" aby uzyskać szukaną liczbę (r)
7) Poczynając od korzenia twórzmy kolejne węzły w następujący sposób:
a) jeśli wartość reszty r=0, to znaleźliśmy pasującą kombinację (ścieżka od aktualnego węzła do roota)
b) jeśli wartość reszty r<0, to dajemy sobie spokój z tym węzłem i idziemy do kolejnego
c) jeśli r>0, to dodajemy nowe potomki dla aktualnego węzła. Przy czym na nowego potomka rozpatrujemy tylko takie liczby (z puli liczb podzielnych przez 11), których wartość k jest nie większa od r. Wartość reszty takiego potomka r' = r - k.
8) No i tak w kółko...
Sorry za rozwlekły i mało ścisły opis algorytmu, ale jest już dość późno i jestem zmęczony. Mam nadzieje, że ogólny sens jest przejrzysty, lecz jak któryś element jest niejasny to pytaj. Nie daję też gwarancji, ze ten algorytm jest jakoś specjalnie optymalny. Ot przyszedł mi do głowy to go napisałem bez większych rozważań.
Ps. w implementacji można by też zamiast drzew wykorzystać zgrabnie rekurencję co pewnie znacznie uprościłoby kod. Nie chce mi się jednak teraz myśleć co jest tutaj wydajniejsze... wielowskaźnikowe drzewa, czy wielokrotne wywołania rekurencyjne. Mocno by to też pewnie zależało od samej implementacji drzew.