Этот метод будет очень медленным при большой длине числа.
Если длина не превышает 64, то лучше использовать числовое преобразование. Тип cardinal - целое без знака.
Код: Выделить всё
var
l,s:string;
n,m,r,k,i,sm:cardinal;
begin
readln(l,s); // ввод длина,вес
n:=strtoint(l);
m:=Math.IntPower(2,n)-1; // теперь в m - максимальное число в двоичном представлении, вроде 1111111 для 7
r:=strtoint(s);
k:=Math.IntPower(2,r)-1; // теперь в k - минимальное число в двоичном представлении, вроде 111 для 3;
for i:=k to m do begin
sm:=0;
// можно сделать цикл, но будет работать медленно, поэтому лучше "ручками" прописать 64 раза
sm:=sm+(i and 1); // накладываем маску на i, узнаем, есть ли бит в последней позиции
sm:=sm+((i shr 1) and 1); // сдвигаем вправо и накладываем маску - проверяем второй бит (справа)
sm:=sm+((i shr 2) and 2); // проверяем третий бит
.... // <-- здесь продолжаем проверки по образцу выше
if (sm=r) then begin // <-- вес подходит
writeln(IntToBin(i,r)); // <-- функция inttobin выводит целое i как двоичное число с r разрядами, погугли Delphi+IntToBin
end;
end;