Рекурсивный алгоритм выражения числа через сумму - C (СИ)
Формулировка задачи:
Помогите написать верный алгоритм решения задачи, по возможности объясните ошибки.
Условие задачи:
ввод:произвольное натуральное число N
ввод: номиналы N чисел
ввод: сумарное число M.
Требуется найти количество способов, которыми можно выразить суммарное число M через введенный цифры (т.е изменяя множитель каждой введенной цифры, так чтобы общая сумма была равна M).
Стал решать в лоб, создавая для каждого числа массива вложенный цикл. Количество циклов не известно, поэтому запихнул в рекурсию. Программа работает неправильно.
Код:
Листинг программы
- #include <stdio.h>
- int recurs(int n);
- int che, pol = 0, counter = 0;
- int mass[3];
- int main()
- {
- int n;
- scanf("%d", &n); //ввод колличества чисел
- for (int i = 0; i < n; i++)
- scanf("%d", &mass[i]); //ввод чисел
- scanf("%d", &che); //ввод суммы
- printf("Колличество способов= %d ", recurs(n)); //вывод колличества
- return 0;
- }
- int recurs(int n)
- {
- if (n >= 1)
- for (int i = 0; i <= che / mass[n - 1]; i++)
- {
- if (n == 1)
- for (int k = 0; k < n; k++)
- {
- pol += mass[k] * i;
- if (pol == che)
- counter++;
- }
- else
- recurs(--n);
- }
- return counter;
- }
Листинг программы
- /*ПРИМЕР ДЛЯ 3 ЧИСЕЛ: int n=3; int num[3]={1,2,5}; int n1=0, n2=0, n5=0, sum=0, che=66,
- counter=0; for (int i=0; i<=che/num[0]; i++) for (int
- j=0; j<=che/num[1]; j++) for (int e=0; e<=che/num[2]; e++) { if
- (num[0]*i+num[1]*j+num[2]*e==che) {counter++; cout<<i<<" "<<j<<" "<<e<<"
- "<<num[0]*i+num[1]*j+num[2]*e<<endl; }} cout<<counter; */
Решение задачи: «Рекурсивный алгоритм выражения числа через сумму»
textual
Листинг программы
- int f(int s, int j) {return j>=as || s<0 ? 0 : s==0 ? 1 : f(s-a[j],j)+f(s,j+1);}
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д