если у вас есть N карт (N = 8), вы можете перечислить все различные тройки в наборе по времени N * (N - 1) * (N - 2) (при N = 8 вы получите 336). Это довольно быстро. Проверьте, какие из троек являются наборами в стиле «рамми», и сохраните их в таблице в виде целых троек (целое число обозначает порядковые номера карточек).
Это первый шаг. Второй шаг - сделать комбинаторную оптимизацию и рассчитать оптимальный выбор. Самый простой способ сделать это - использовать поиск с возвратом. Вы запускаете индекс ('i') для множества найденных троек. Сначала вы пытаетесь включить «i» тройку в решение, а затем рекурсивно продолжить с индекса i + 1; затем вы возвращаетесь и решаете, что в решении i-я тройка равна , а не , и продолжаете с i + 1 рекурсивно. Есть много оптимизаций для этого, но для небольших наборов это будет работать довольно хорошо.
Вот как это работает с вашим примером:
Карты: 6D, 7D, 7C, 7H, 8D, 8C, 9C, 10H
Давайте перечислим все возможные тройки:
Cards Index triple
6D 7D 8D <0, 1, 4>
7D 7C 7H <1, 2, 3>
7C 8C 9C <2, 5, 6>
Полный обратный поиск выглядит так:
Decide on <0, 1, 4>:
<0, 1, 4> INCLUDED:
<1, 2, 3> CLASHES with <0, 1, 4>
Decide on <2, 5, 6>:
<2, 5, 6> INCLUDED:
Solution with 2 sets (* BEST SOLUTION)
<2, 5, 6> EXCLUDED:
Solution with 1 sets
<0, 1, 4> EXCLUDED:
Decide on <1, 2, 3>:
<1, 2, 3> INCLUDED:
<2, 5, 6> CLASHES with <1, 2, 3>
Solution with 1 sets
<1, 2, 3> EXCLUDED:
Decide on <2, 5, 6>:
<2, 5, 6> INCLUDED:
Solution with 1 set
<2, 5, 6> EXCLUDED:
Solution with 0 sets
Затем вы выбираете решение с большинством наборов (отмечены звездочкой).
Это довольно просто реализовать. Попробуйте!