Надо методом перебора. Я сделал, только они повторяются: 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:=1 to q do S:=S+a[i]; Suma:=(S=n); end; procedure Print; var i:integer; begin for i:=1 to q do write(a[i],' '); { readln;} end; procedure BackTr(k:integer); var i:integer; begin if q=k-1 then Print //но тут ещё if Suma then Print надо поставить else begin i:=a[k-1]+1; while not Suma do begin a[k]:=i; BackTr(k+1); inc(i); end; end; end; Begin ClrScr; readln(n,q); BackTr(1); readln; end.