Рекурсивный алгоритм выражения числа через сумму - 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);}
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д