Столкнулся с такой проблемой: Дан массив целых чисел (не больше 50 елементов). Надо сказать, не является ли любое из чисел суммой нескольких других из этого массива. Не знаю как это сделать эфективно.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3993 |
2 | jiangly | 3743 |
3 | orzdevinwang | 3707 |
4 | Radewoosh | 3627 |
5 | jqdai0815 | 3620 |
6 | Benq | 3564 |
7 | Kevin114514 | 3443 |
8 | ksun48 | 3434 |
9 | Rewinding | 3397 |
10 | Um_nik | 3396 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
10 | nor | 152 |
Столкнулся с такой проблемой: Дан массив целых чисел (не больше 50 елементов). Надо сказать, не является ли любое из чисел суммой нескольких других из этого массива. Не знаю как это сделать эфективно.
Название |
---|
Не знаю как это сделать эфективно.
http://acm.lviv.ua/fusion/viewpage.php?page_id=9&id=1007&rid=50e34132eff8a
На таких ограничениях рюкзак проще всего, а если бы числа были произвольными, meet-in-the-middle можно применять.
Можно по-подробнее с meet-in-the-middle?
Делим элементы на две равные части, генерируем в каждой из частей суммы всех подмножеств. Все суммы вместе с соответствующими битмасками сохраняем в два массива, по одному для каждой части. После этого перебираем все элементы и идем двумя указателями по массивам, пытаясь набрать нужную сумму. При этом в том массиве, откуда родом рассматриваемый элемент, не надо учитывать те подмножества, куда он входит. O(n·20.5n) должно зайти.
И да, я считаю, что для зеленых как рюкзак, так и meet-in-the-middle слишком сложно, лучше сначала научиться безошибочно решать халяву и приобрести олимпиадное мышление. Это гарантированно принесет фиолетовый цвет, и только потом уже можно начинать изучать алгоритмы с пользой для себя. Вот так.
Рюкзак не смог написать(решение пытается минимальным путем дойти). Вот рекурсия (не знаю пройдет ли по времени).
UPD: В решении с рекурсии размер массива
a
лучше увеличить до 110.При небольших ограничениях можно сложить рюкзак, параллельно считая количество чисел в каждом элементе рюкзака. Потом пройти по рюкзаку, смотря только на те элементы, которые составлены более, чем из 1 числа, и проверять, есть ли число в последовательности, равное элементу рюкзака. Соответственно проставлять в последовательности true. Потом проверить, все ли числа из последовательности помечены, как true. Вот тут читать про рюкзак.