Надо методом перебора. Я сделал, только они повторяются: 1 3 5 - 5 3 1 Может у вас есть алгоритм для этой задачи? Я думал сохранить результаты в массиве, т.е если числа вектора не повторяются с теми что из массива то добавляем в массив, но это не эфективно, думаю есть более простой метод. Спасибо.
Забыл сказать что все числа должны быть разными (т.е варианты типа 3 3 9 не печатать) Вот моя идея: например для n=9, k=3 создаем вектор: 1 2 3 Теперь увеличиваем 3 пока сума вектора не будет N 1 2 4 1 2 5 1 2 6 -> решение теперь идем к переведущему числу, уже к 2 и увеличиваем его на 1 единицу: и опять последний увеличиваем: 1 3 4 1 3 5 -> решение увиличиваем 3 так как 1 4 5 больше N то идем к первому элементу и увеличиваем его 2 3 4 ->решение теперь уже ничего увеличивать нельзя, так как сума будет больше N Вот что я пробовал сделать :
Program(Показать/Скрыть)
Uses Crt;
var a:array[0..10] of integer; n,q,i:integer;
function Suma:boolean; //смотрим суму вектора, если равна N значит ответ TRUE
var S,i:integer;
begin
S:=0;
for i:=1to q do
S:=S+a[i];
Suma:=(S=n);
end;
procedure Print;
var i:integer;
beginfor i:=1to q do
write(a[i],' ');
{ readln;}end;
procedure BackTr(k:integer);
var i:integer;
beginif q=k-1then Print //но тут ещё if Suma then Print надо поставить
elsebegin
i:=a[k-1]+1;
whilenot Suma dobegin
a[k]:=i;
BackTr(k+1);
inc(i);
end;
end;
end;
Begin ClrScr;
readln(n,q);
BackTr(1);
readln;
end.