Постановка задачи:
Даны числа
.
Дано множество
A состоящее из чисел
,
.
Найти количество подмножеств множества
A с суммой нуль.
Пример:
Пусть
.
Генератором случайных чисел сгенерировано множество
A, состоящее из
чисел:
Код:
440, -276, 436, -494, -154, 157, 24, 450, -208, 177, 345, -392, -143, -411, -67, -88, -152, 444, 145, 420, 416, -122, -202, 251, -52, 19, 210, -443, -475, 292, 127, 390, -288, 163, -87, -254, 185, -119, -58, 62, -360, 72, 79, 2, 82, 114, -241, -267, 234, -433, 188, -451, -295, -231, -185, -450, -333, 410, 137, -186, 411, 197, -128, 208, 12, -402, 153, 254, -286, -75, 240, -173, -128, -89, -466, -152, 218, 438, 186, -233, -322, 235, 315, 453, 190, -318, 261, 372, -239, -2, 130, 184, 291, -274, -174, 209, -319, -154, -467, 497, -431, 225, -192, -297, 489, 342, -106, -236, -217, 210, 25, 405, -359, -2, -463, 473, -275, -120, -476, -484, -244, 231, 431, -164, 434, 442, 331, 42, 25, -175, 219, 340, 102, -369, 285, 354, -212, 238, 30, 318, 160, 45, -21, -312, -29, 166, -387, -239, 463, 252, -51, -25, 92, 364, -40, 474, 338, -383, -52, -3, -420, 6, -436, -385, 338, -394, -49, 331, 47, -65, -89, -418, -436, 103, -143, 312, 197, 141, 328, 133, -78, -3, -481, -139, -111, 45, -105, 305, 170, -468, 341, -360, 170, 325, 15, -38, 291, -378, 495, -461
Общее количество подмножеств равно
(растет экспоненциально с ростом
), провести такое количество итераций на домашней машине было бы напряжно по времени. Но полиномиальным алгоритмом выбраны все с суммой нуль за несколько секунд.
Их оказалось ровно 319 699 935 754 192 743 287 521 894 442 243 867 414 426 644 430 291 392 989 подмножеств (включая пустое).
Олимпиадный вопрос:
Доказать, что данная задача принадлежит классу
, построив полиномиальный алгоритм ее решения.