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

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


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

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

11   голосов , оценка 3.909 из 5
Похожие ответы