Задать вопрос

Почему рекурсия неверно отрабатывает?

Задача

Ириска весит X грамм, мандарин – Y грамм, пряник – Z грамм.

Требуется написать программу, которая определит, сколько различных вариантов подарков весом ровно W грамм может сделать Дед Мороз.

Входные данные
В единственной строке входного файла INPUT.TXT содержится четыре целых числа X, Y, Z и W (1 ≤ X, Y, Z ≤ 100, 1 ≤ W ≤ 1000).

Выходные данные
Выходной файл OUTPUT.TXT должен содержать одно целое число – количество вариантов подарков.

with open('data317.txt') as f:
     a, h, z, n = [int(x) for x in next(f).split()] # read first line

print(a, h, z, n)

edge = max(a, h, z)
zero = 0
w = open("output.txt", "w")
if n != 0:
    def f(n, edge):
        #print("f", n)

        if n == 0: return 1
        if n < 0:
            return 0

        count = 0

        if edge >= a:
            count = f(n - a, a)
        if edge >= h:
            count = count + f(n - h, h)
        if edge >= z:
            count = count + f(n - z, z)

        return count

    print(f(n, edge))

    w.write(str(f(n, edge)))
else:
    w.write(str(0))
w.close()


Не проходит тестирование, при этом вроде бы определяет верно

Источник: https://acmp.ru/index.asp?main=task&id_task=317
  • Вопрос задан
  • 515 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Ваша программа ломается, если X=Y, например.
Чтобы ее исправить, вместо веса edge и сравнения его со стоимостью товара, передавайте в функцию число от 1 до 3. Если число <=1, то можно брать x и передавать 1. Если <=2 - то можно брать y и передавать 2, и т.д.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@anerev
Сила гугла
with open("input.txt", "r") as file:
	x, y, z, w = [int(x) for x in next(file).split()]

count = 0
for i in range(0, w // x + 1):
    rest = w - x * i
    for j in range(0 , rest // y + 1):
        if (rest - y * j) % z == 0:
            count += 1
  
with open("output.txt", "w") as file:
	file.write(str(count))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы