Рекурсивный алгоритм выражения числа через сумму - 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);}