Рекурсивный алгоритм выражения числа через сумму - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите написать верный алгоритм решения задачи, по возможности объясните ошибки. Условие задачи: ввод:произвольное натуральное число N ввод: номиналы N чисел ввод: сумарное число M. Требуется найти количество способов, которыми можно выразить суммарное число M через введенный цифры (т.е изменяя множитель каждой введенной цифры, так чтобы общая сумма была равна M). Стал решать в лоб, создавая для каждого числа массива вложенный цикл. Количество циклов не известно, поэтому запихнул в рекурсию. Программа работает неправильно. Код:
Листинг программы
  1. #include <stdio.h>
  2. int recurs(int n);
  3. int che, pol = 0, counter = 0;
  4. int mass[3];
  5. int main()
  6. {
  7. int n;
  8. scanf("%d", &n); //ввод колличества чисел
  9. for (int i = 0; i < n; i++)
  10. scanf("%d", &mass[i]); //ввод чисел
  11. scanf("%d", &che); //ввод суммы
  12. printf("Колличество способов= %d ", recurs(n)); //вывод колличества
  13. return 0;
  14. }
  15. int recurs(int n)
  16. {
  17. if (n >= 1)
  18. for (int i = 0; i <= che / mass[n - 1]; i++)
  19. {
  20. if (n == 1)
  21. for (int k = 0; k < n; k++)
  22. {
  23. pol += mass[k] * i;
  24. if (pol == che)
  25. counter++;
  26. }
  27. else
  28. recurs(--n);
  29. }
  30. return counter;
  31. }
Листинг программы
  1. /*ПРИМЕР ДЛЯ 3 ЧИСЕЛ: int n=3; int num[3]={1,2,5}; int n1=0, n2=0, n5=0, sum=0, che=66,
  2. counter=0; for (int i=0; i<=che/num[0]; i++) for (int
  3. j=0; j<=che/num[1]; j++) for (int e=0; e<=che/num[2]; e++) { if
  4. (num[0]*i+num[1]*j+num[2]*e==che) {counter++; cout<<i<<" "<<j<<" "<<e<<"
  5. "<<num[0]*i+num[1]*j+num[2]*e<<endl; }} cout<<counter; */

Решение задачи: «Рекурсивный алгоритм выражения числа через сумму»

textual
Листинг программы
  1. int f(int s, int j) {return j>=as || s<0 ? 0 : s==0 ? 1 : f(s-a[j],j)+f(s,j+1);}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы