COINS문제 RTE 문제 어떻게 해결해야할지 모르겠습니다..

  • jhchae0049
    jhchae0049
    # Algospot tutorial problem - DP
    #
    # Coin problem solved by dynamic programming
    #
    # Name: Jeonghun
    # Collaborators: None
    # Time: started at 3:28 PM on March 28th
    #       ended at ...
    import sys
    
    def eval_coins(total, num_kind, coin_list, memo):
        if memo[total][num_kind] != 0: return memo[total][num_kind]
        else:
            if num_kind == 1:
                if total % coin_list[num_kind - 1] == 0:
                    memo[total][num_kind] = 1
                    return 1
                else: return 0
            else:
                if coin_list[num_kind - 1] > total:
                    memo[total][num_kind] = eval_coins(total, num_kind - 1, coin_list, memo)
                    return memo[total][num_kind]
                else:
                    memo[total][num_kind] = eval_coins(total, num_kind - 1, coin_list, memo) \
                            + eval_coins(total - coin_list[num_kind - 1], num_kind, coin_list, memo)
                    return memo[total][num_kind]
    def main():
        rl = lambda: sys.stdin.readline()
        numTest = rl().strip()
        for _ in range(int(numTest)):
            memo = [[0 for x in range(101)] for y in range(5001)]
            total, num_kind = map(int, rl().strip().split())
            coin_list = map(int,rl().split())
            res = eval_coins(total, num_kind, coin_list, memo)
            print res % 1000000007L
        return
    main()
    

    위가 제 소스코드구요. 알고리즘은 재귀적으로 마지막 동전을 하나도 안쓰거나 아니면 1개를 제외한 것의 합으로 구현했습니다.
    => d(M,k) = d(M,k-1) + d(M-Ck, k)
    주어진 TC는 모두 무리없이 돌아가며 인덱스 오류나, zero division등 평소에 실수할만할 것은 모두 체크해보았으나 디버깅이 안되네요.. 조금만 도와주시면 정말 감사하겠습니다.. ㅠㅠ!


    8년 전
1개의 댓글이 있습니다.
  • jhchae0049
    jhchae0049

    하하 해결했네요, 파이썬에 function call stack 을 초과하는 case가 있었더라구요. 그래서 memoization을 bottom up으로 해서 구하니까 무리없이 답 나왔습니다. 혹시 저같은 에러로 고생하시는 분들이 있을까 자문에 자답합니다~


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.