PHP: Вот нерекурсивная реализация. Я не говорю, что это самый эффективный способ сделать это (это действительно экспоненциально 2 ^ N - см. Ответ и комментарии JasonTrue), но он работает для небольшого набора элементов. Я просто хотел написать что-то быстрое, чтобы получить результаты. Я основал алгоритм на ответе Мультяшки.
$set = array(3, 5, 8, 13, 19);
$additions = array();
for($i = 0; $i < pow(2, count($set)); $i++){
$sum = 0;
$addends = array();
for($j = count($set)-1; $j >= 0; $j--) {
if(pow(2, $j) & $i) {
$sum += $set[$j];
$addends[] = $set[$j];
}
}
$additions[] = array($sum, $addends);
}
sort($additions);
foreach($additions as $addition){
printf("%d\t%s\n", $addition[0], implode('+', $addition[1]));
}
Который выдаст:
0
3 3
5 5
8 8
8 5+3
11 8+3
13 13
13 8+5
16 13+3
16 8+5+3
18 13+5
19 19
21 13+8
21 13+5+3
22 19+3
24 19+5
24 13+8+3
26 13+8+5
27 19+8
27 19+5+3
29 13+8+5+3
30 19+8+3
32 19+13
32 19+8+5
35 19+13+3
35 19+8+5+3
37 19+13+5
40 19+13+8
40 19+13+5+3
43 19+13+8+3
45 19+13+8+5
48 19+13+8+5+3
Например, случаем для этого может быть набор полос сопротивления для тренировки. Допустим, вы получаете 5 полос, каждая из которых имеет различные сопротивления, представленные в фунтах, и вы можете комбинировать полосы, чтобы суммировать общее сопротивление. Сопротивление полос составляет 3, 5, 8, 13 и 19 фунтов. Этот набор дает вам 32 (2 ^ 5) возможных конфигураций, минус ноль. В этом примере алгоритм возвращает данные, отсортированные по возрастанию общего сопротивления, в первую очередь, в пользу эффективных конфигураций полос, а для каждой конфигурации полосы сортируются по убыванию сопротивлений.