Это довольно сложный, но очень интересный предмет по математике (известный как «проблема покрытия» ),
И я хотел бы, чтобы вы помогли в его реализации.
Представьте себе лотерею, в которой каждый билет должен выбрать 5 случайных чисел в наборе из 50 чисел (от 1 до 50).
Достаточно легко узнать вероятность выигрышного билета или вероятность иметь 1, 2, 3 или 4 хороших номера.
Также довольно легко «сгенерировать» все билеты с 1, 2, 3, 4 хорошими номерами.
Мой вопрос (и проблема кода) связан с этим, но немного отличается:
Я хочу купить лотерейные билеты (как можно меньше), например, хотя бы один из моих билетов имеет 3 хороших номера.
Вызов
Ваша цель - реализовать общее решение (в виде программы или просто функции), например, на любом языке:
// Input: 3 prameters
min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want)
Для приведенного выше примера нужно просто позвонить:
min_lottery_tickets(50, 5, 3)
и программа сгенерирует наименьший набор билетов для игры для достижения этой цели.
Пример:
min_lottery_tickets(10, 5, 2)
выдаст 7 билетов, например:
1 2 3 4 5
5 6 7 8 9
10 1 2 6 7
10 3 4 8 9
3 4 6 7 8
1 2 3 8 9
1 4 9 5 10
потому что таких билетов достаточно для покрытия любой пары чисел от 1 до 10.
Выход
Текст, одна строка для заявки, табуляции или пробелы между цифрами
кто выигрывает
Побеждает наиболее эффективная программа (т.е. программа, генерирующая наименьшее количество билетов по указанным выше параметрам):
min_lottery_tickets(50, 5, 3)
Благодаря!
Ответы:
Я знаю, что это не оптимально , но вот код в node.js:
Некоторые примеры результатов:
разное:
разное:
источник
min_lottery_tickets(10, 5, 2)
генерирует гораздо больше решений, чем ОП.