Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LosTSamara
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 38
#1

Рекурсия (алгоритм подсчета числа способов, с помощью которых можно представить число М в виде суммы) - C++

11.03.2013, 20:29. Просмотров 947. Ответов 1
Метки нет (Все метки)

Нужно написать рекурсивный алгоритм подсчета числа способов, с помощью которых можно представить число М в виде суммы, каждое слагаемое которой не превосходит число N. Тут должен быть несложный алгоритм, но я никак не могу его понять, помогите пожалуйста)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 20:29     Рекурсия (алгоритм подсчета числа способов, с помощью которых можно представить число М в виде суммы)
Посмотрите здесь:

Оптимизировать поиск числа способов представить число в виде суммы четырёх положительных целых чисел - C++
Сумма Задано целое положительное целое число x. Найдите число способов представить его в виде суммы четырёх положительных целых чисел...

Найти все натуральные числа, не превосходящие числа n, которые можно представить в виде суммы слагаемых - C++
Заданы три натуральных числа a, b, n. Найти все натуральные числа, не превосходящие числа n, которые можно представить в виде суммы (...

Определить, можно ли заданное число представить в виде суммы двух квадратов - C++
Задачка: можно ли заданное число представить в виде суммы двух квадратов. Решил вот так: #include <math.h> #include <iostream> ...

Определить, можно ли представить число N в виде суммы кубов трех натуральных чисел - C++
Определить можно ли представить заданное натуральное число N как сумму кубов каких-нибудь трех натуральных чисел n, m, k. ...

Определить, можно ли представить заданное число в виде суммы четырех простых чисел - C++
Люди,помоги решить задачку: Дано натуральное число n. Можно ли представить его в сумме четырех простых чисел? Вывести на печать все...

Определить, можно ли число представить в виде суммы квадратов трех натуральных чисел - C++
Дано натуральные число n . Можно ли представить его в виде суммы трех квадратов натуральных чисел? Если можно то, а) указать тройку x,y,z...

Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел - C++
Дано натуральное число n.Определить,можно ли представить его в виде суммы двух квадратов натуральных чисел.Если да,то найти все пары x,y...

Дано натуральное число n. Можно ли представить его в виде суммы трех квадратов натуральных чисел? - C++
Подскажите как правильно составить программу к этим задачам: 1.Дано натуральное число n. Можно ли представить его в виде суммы трех...

Определить, можно ли заданное натуральное число представить в виде квадрата какого либо простого числа - C++
:cry:помогите

Даны натуральное число n. Среди чисел 1, 2, …, n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел - C++
Даны натуральное число n. Среди чисел 1, 2, …, n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
12.03.2013, 21:14     Рекурсия (алгоритм подсчета числа способов, с помощью которых можно представить число М в виде суммы) #2
вот самый медленный способ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
int calc (int m, int n)
{
    if ( m < 0 ) {
        return 0;
    }
    if ( m <= 1 || n == 1 ) {
        return 1;
    }
 
    return calc (m, n - 1) + calc (m - n, n); 
}
 
int main ()
{
    int M, N;
    std::cin >> M >> N;
 
    std::cout << calc (M, N) << std::endl;
 
    return 0;
}
а вот быстрее, с запоминанием посчитанных значений
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
#define SIZE 100
 
int arr[SIZE][SIZE];
 
int calc (int m, int n)
{
    if ( m >= 0 && m >= 0 && arr[m][n] > 0 ) {
        return arr[m][n];
    }
    if ( m < 0 ) {
        return 0;
    }
    if ( m <= 1 || n == 1 ) {
        return 1;
    }
 
    arr[m][n] =  calc (m, n - 1) + calc (m - n, n); 
 
    return arr[m][n];
}
 
int main ()
{
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            arr[i][j] = -1;
        }
    }
 
    int M, N;
    std::cin >> M >> N;
 
    std::cout << calc (M, N) << std::endl;
 
    return 0;
}
в этом случае M и N должны быть не больше SIZE (можно сделать динамический массив, тогда M и N будут ограничены размером ОЗУ).
Можно еще ускорить, если вставить код массив с предпосчитанными значениями, но это если есть острая необходимость.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru