IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Минимальное количество чисел, Сумма квадратов которых дает число N
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 28

Репутация: -  0  +


Есть число N (N<=5000000)
Нужно определить минимальное количество чисел, сумма квадратов каких дает число N. Например, число 61 можна представить в виде суммы квадратов двух чисел 6^2+5^2
Спасибо за внимание. :о)


--------------------
С уважением,
Таука.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


Похожие задачи уже рассматривались.
В чем конкретно проблема? Чем помочь?
Уж очень не хочется сразу код выкладывать....


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


на словах ::
count:=0;
1: находишь максимальный полный квадрат и уменьшаешь N на него -- N:=N-sqr(trunc(sqrt(N))); count:=count + 1; если N > 0 тогда goto 1

writeln(count);


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


решение Virt'а неправильное. например, 12 оно разложит на 3^2+1^2+1^2+1^2, т.е. ответ 4, а можно сделать 2^2+2^2+2^2, т.е. получить ответ 3.
однако, более правильное решение имеет сложность порядка N^(3/2), а для ваших ограничений это многовато (хотя, если памяти хватает, то вполне приемлимо).


--------------------
учим школьников программированию (и математике до кучи): информация здесь: Webpage
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 28

Репутация: -  0  +


Вобще то пока проблема каким образом определять эти квадраты чисел. Я вначале думала так, как Virt. Если максимальное не всегда подходит, значит нужно делать переборы и выбирать, когда количество будет самым маленьким? Пока что не знаю как это делать.


--------------------
С уважением,
Таука.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


Код
program minimum_kvadrats;
var a:array[1..32000]of word;
   n,i,j:longint;
   s:word;

begin
  readln(n);
  fillchar(a,sizeof(a),0);
  if sqr(trunc(sqrt(n))) = n then writeln(1) else
     begin
        for i:=1 to n do
           if sqr(trunc(sqrt(i))) = i then a[i]:=1 else
              begin
                 s:=maxint;
                 for j:=1 to trunc(sqrt(i)) do
                    if a[i-sqr(j)]+1 < s then s:=a[i-sqr(j)]+1;
                 a[i]:=s;
              end;
        writeln(a[n]);
     end;
end.

решение по алгоритму предложенному Михаилом.

ЗЫ
для 5.000.000 надо 10Мб ,существует ли алгоритм с меньшими требованиями памяти?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


вот правильное решение:
Эта задача решается с помощью динамического программирования.
Сначала проверим, не является ли число полным квадратом. Если так, то сразу выводим "1" и заканчиваем. Если же не является, то придется потрудиться.

Заведем массив размером в 60000 элементов - в нем мы будем хранить количество участков для каждой площади. Пройдем его с 1 до N, если текущее число (i) - квадрат целого числа, то в соответствующий элемент массива записываем 1 и переходим к следующему. Если же это не так, то тут понадобиться еще один цикл (j) от 1, до тех пор, пока разность между i и j2 не станет меньше 1. Итак, мы можем узнать, сколько участков необходимо, чтобы скупить территорию i - j2; для того, чтобы скупить территорию площадью i, необходимо на один участок больше (этот участок со стороной j). Среди всех возможных j выберем минимальное количество участков для площади i и перейдем к следующему i. Этим мы полностью рассматриваем все варианты и выбираем наилучший (в этом несложно убедиться).


--------------------
учим школьников программированию (и математике до кучи): информация здесь: Webpage
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 14:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name