Помощь - Поиск - Пользователи - Календарь
Полная версия: Разбиение числа на слагаемые
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
DarkWishmaster
Надо методом перебора. Я сделал, только они повторяются:
1 3 5 - 5 3 1
Может у вас есть алгоритм для этой задачи?
Я думал сохранить результаты в массиве, т.е если числа вектора не повторяются с теми что из массива то добавляем в массив, но это не эфективно, думаю есть более простой метод.
Спасибо.
Lapp
Цитата(DarkWishmaster @ 17.04.2011 23:14) *
Надо методом перебора. Я сделал, только они повторяются:
1 3 5 - 5 3 1
Может у вас есть алгоритм для этой задачи?
Я думал сохранить результаты в массиве, т.е если числа вектора не повторяются с теми что из массива то добавляем в массив, но это не эфективно, думаю есть более простой метод.

Есть.
Подобные задачи решались на форуме много раз. Например, тут: Рекурсия (но не точно такая). А вообще - поиск..
volvo
Цитата
Может у вас есть алгоритм для этой задачи?
Алгоритм ты озвучил сам: перебор.

Есть реализация: числа, дающие в сумме заданное число
Повторений не наблюдается...
DarkWishmaster
Забыл сказать что все числа должны быть разными (т.е варианты типа 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 (Показать/Скрыть)

без рекурсии я знаю как сделать, а тут...
volvo
Цитата
без рекурсии я знаю как сделать
Покажи то, что ты придумал без рекурсии...
DarkWishmaster
Цитата(volvo @ 18.04.2011 16:48) *

Покажи то, что ты придумал без рекурсии...


щяс попробую
volvo
Заодно попробуй вот это (набирал прямо здесь, так что может чего где забыл, поправь если что) :

var
q : integer;
n : integer;

arr : array[1 .. 10] of integer;

procedure p(start, count : integer);
var i, s : integer;
begin
if count > q then
begin
s := 0;
for i := 1 to q do s := s + arr[i];
if s = n then
begin
for i := 1 to q do write(arr[i]:3);
writeln;
end;
end
else
begin
for i := start + 1 to n do // Вот основная идея: чтоб решения и слагаемые не повторялись
begin
arr[count] := i;
p(arr[count], count + 1); // рекурсия присутствует
end;
end;
end;

begin
n := 9;
q := 3;
p(0, 1);
end.
DarkWishmaster
Спасибо, volvo, только что закончил, вот без рекурсии
только пока работает только с макс. с K=3
KOD (Показать/Скрыть)

твоя работает, иду разбираться, спасибо!
Lapp
Цитата(volvo @ 18.04.2011 16:26) *
Алгоритм ты озвучил сам: перебор.

Есть реализация: числа, дающие в сумме заданное число
Повторений не наблюдается...
volvo, а почему ты счел возможным совершенно проигнорировать мой пост (Разбиение числа на слагаемые) и даже не извиниться?.. blink.gif Мне кажется, это не принято.

По данной мной ссылке содержится решение, которое требует минимальных изменений (сделать вывод только в случае нужного числа слагаемых).

-1 norespect.gif

Добавлено через 7 мин.
Цитата(volvo @ 18.04.2011 16:26) *
Алгоритм ты озвучил сам: перебор.
Перебор - это класс алгоритмов, а не алгоритм.

Вот мое модифицированное решение:
const
m=1000;
var
a: array[1..m]of integer;
k,n,q: integer;

procedure Split(j,n: integer);
var
i: integer;
begin
if (n=0)and(k=q) then begin
for i:=1 to k do Write(a[i]:4);
WriteLn
end
else for i:=j to n do begin
Inc(k);
a[k]:=i;
Split(i+1,n-i);
Dec(k)
end
end;

begin
Write('n = ');
ReadLn(n);
Write('q = ');
ReadLn(q);
k:=0;
Split(1,n);
ReadLn
end.
volvo
Цитата
а почему ты счел возможным совершенно проигнорировать мой пост
Я не игнорировал пост. Зашел, посмотрел. Кстати, на мысль воспользоваться поиском меня навел именно твой пост. Но извиняться перед всей Вселенной за то, что может быть кто-то где-то когда-то уже писал подобную программу, или программу, которую можно минимальными усилиями преобразовать к нужному функционалу - не собираюсь.

Цитата
-1 norespect.gif
Запомни этот пост. И потом, если вдруг у тебя начнут появляться минусы, я буду давать тебе на него ссылку. Если, конечно, ты не воспользуешься раньше возможностью чистки своего рейтинга, что уже было. Хочешь - напомню, где? norespect.gif Я, как видишь, этим не пользуюсь.

И, на будущее: я не влазил ни в одно твое обсуждение (по крайней мере, не приводил там СВОЙ код, максимум - давал наводящие замечания). Ты - залез везде, где только можно. Везде, где бы я не ответил - ты потом ТОЖЕ ПОБЫВАЛ, и оставил свою версию программы. Ну что ж...
Lapp
Цитата(volvo @ 19.04.2011 11:46) *
Я не игнорировал пост. Зашел, посмотрел. Кстати, на мысль воспользоваться поиском меня навел именно твой пост. Но извиняться перед всей Вселенной за то, что может быть кто-то где-то когда-то уже писал подобную программу, или программу, которую можно минимальными усилиями преобразовать к нужному функционалу - не собираюсь.

Запомни этот пост. И потом, если вдруг у тебя начнут появляться минусы, я буду давать тебе на него ссылку. Если, конечно, ты не воспользуешься раньше возможностью чистки своего рейтинга, что уже было. Хочешь - напомню, где? norespect.gif Я, как видишь, этим не пользуюсь.

И, на будущее: я не влазил ни в одно твое обсуждение (по крайней мере, не приводил там СВОЙ код, максимум - давал наводящие замечания). Ты - залез везде, где только можно. Везде, где бы я не ответил - ты потом ТОЖЕ ПОБЫВАЛ, и оставил свою версию программы. Ну что ж...

Очень впечатляет.
а. достаточно было сказать в начале того поста "я тоже добавлю"
хам ты, Володя
хамом был, хамом остался
и с хамами мне не по дороге

всего самого доброго, не буду больше следить в твоих темах, как и в остальных
господствуй один
Lapp
Тема разделена, остаток перенесен сюда: О недавних событиях на Форуме
ta bort gäddhä

My family all the time say that I am killing my time here at net, but I know I am getting familiarity daily by reading such good articles or reviews. ta bort gäddhäng med laser juakee.sewomabest.com/map21.php
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.