Это проблема "top-k", а не проблема, требующая комбинаций "k". Для чтения давайте выберем N = 990, K = 7. Вам нужно выбрать 7 лучших баллов в списке из 990.
Вы сделали это, сгенерировав C (990, 7) = 912,459,983,564,271,542,400 комбинации , затем определяют, сколько 1
битов в каждом из 7 чисел в каждой комбинации. Вот почему у вас заканчивается время: у вас есть 990 чисел, которые нужно учитывать, но вы повторяете количество раз в миллионы раз для каждого числа на входе.
Сбейте его. Все, что вам нужно, - это go просмотреть этот список один раз и сохранить верхние 7-битные значения. Нет взаимодействия между 7 числами в списке. На самом деле вам даже не нужно сообщать о цифрах, а просто общую оценку.
Начните со списка из семи нулей. Теперь переберите все 990 номеров. Каждый раз, когда вы находите число битов больше, чем наименьший элемент списка (сохраняйте его отсортированным для удобства пользования), затем заменяйте его новым счетом (и пересортируйте). В конце всех 990 чисел, sum
список.
Также считать биты намного проще, чем вы. Преобразуйте int
в двоичную строку и используйте str.count(1)
, чтобы увидеть, сколько в ней 1
битов.