Я пробовал, но не нашел похожих вопросов. Если будут повторяющиеся вопросы, дайте ссылку.

Я видел, как кто-то задал на форуме интересную проблему с алгоритмом. Задача спрашивает, сколькими способами можно разбить 106 на линейную комбинацию из 10, 20, 50, 1, 2 и 5? Например, 106 = 10 * 6 + 1 * 6, 106 = 50 * 2 + 2 * 1 + 1 * 4.

Я использовал python для решения этой проблемы, но он очень медленный. И я также обобщил свою функцию, чтобы ее можно было применять не только к 106, но и к другим числам.

Есть ли способ ускорить мой алгоритм? У меня уходит несколько минут, чтобы получить 160 способов, что составляет очень небольшую часть всех решений, и у меня нет терпения ждать новых результатов, потому что по мере того, как идет рекурсия, одно решение будет занимать все больше и больше времени.

def main(total,*args):
    def recursion(Sum,method):          
        for arg in args:
            if Sum<arg:
                continue
            method[arg]+=1
            if Sum>arg:
                recursion(Sum-arg,method)
            else:
                methods.append(method.copy())
            method[arg]-=1
    methods=[]
    recursion(total,{ arg:0 for arg in args})
    return len(methods)

main(106,10,20,50,1,2,5)
0
Seaky Lone 28 Дек 2017 в 11:09

1 ответ

Лучший ответ

Это похоже на проблему обмена монет. Вы можете обратиться к приведенной ниже ссылке, чтобы узнать о различных подходах к решениям: проблема смены монеты gfg

1
sourabh1024 28 Дек 2017 в 08:18