Alyona和Copybooks:这段代码出了什么问题

时间:2016-11-25 05:23:01

标签: algorithm recursion

以下是来自CodeForces#381(第2部分)(link)的Alyona和Copybooks的问题陈述。

  

小女孩Alyona正在一家商店买一些学校用的抄写本。她   研究四个科目,所以她想要有相同数量的抄写本   每个科目。中有三种类型的字帖包   商店:可以买一张卢布的字帖,一包两张   b卢布的抄写本和一包三本c卢布的抄写本。   Alyona已经有了n本抄写本。

     

购买此类号码应支付的最低卢布金额是多少   副本书k,n + k可被4整除?有无数的   商店里的任何类型的包。 Alyona可以购买不同类型的包装   在同一次购买中。

     

输入唯一的行包含4个整数n,a,b,c   (1≤N,A,B,C≤109)。

     

输出打印购买此类产品应支付的最低卢布金额   n + k的副本k的数量可以被4整除。

我最初试图通过探索如何使数量可被4整除的所有可能性来解决它。让f(n)为min。购买x教科书的成本使得(n + x)%4 = 0.然后,f(n)=min(f(n+1)+a, f(n+2)+b, f(n+3)+c)。完整代码如下:

import sys
INF = sys.maxsize

def solution(n, prices):
    if n % 4 == 0:
        return 0
    else:
        ans = INF
        ans = min(solution(n + 1, prices) + prices[A],
              solution(n + 2, prices) + prices[B],
              solution(n + 3, prices) + prices[C])
        return ans

但是,它没有通过所有测试用例。我不知道为什么。这种方法有什么问题?

1 个答案:

答案 0 :(得分:1)

您的递归解决方案实际上是一个3-way递归树。

调用solution(3)时,每一步的调用堆栈都是:

[sol(4),sol(5),sol(6)] - > [sol(5),sol(6)] - > [sol(6),sol(7),sol(8),sol(6)] - > [sol(7),sol(8),sol(9),sol(7),sol(8),sol(6)] - > ........

这会产生内存问题,例如超出堆栈限制。请从这里删除递归。您可以将解决方案修改为:

def solution(n,prices):
  if n%4==0:
    return 0
  rem = 4-(n%4)
  if rem==1:
    return min(prices[0],prices[1]+prices[2],3*prices[2])
  elif rem==2:
    return min(2*prices[0], prices[1], 2*prices[2])
  else:
    return min(3*prices[0],prices[0]+prices[1],prices[2])

希望它有所帮助!!!

编辑:我修改了你的递归解决方案以杀死无休止的递归。

import sys
INF = sys.maxsize

def solution(n, prices, k):
    if k>10:
        return INF
    if n % 4 == 0:
        return 0
    else:
        ans = min(solution(n + 1, prices,k+1) + prices[0],
              solution(n + 2, prices,k+2) + prices[1],
              solution(n + 3, prices,k+3) + prices[2])
        return ans

def main():
  n,a,b,c = map(int, raw_input().split())
  prices = [a,b,c]
  print solution(n,prices,0)

main()